为什么URLSession返回null而不是json数据作为响应

时间:2020-07-16 21:14:37

标签: javascript node.js swift swiftui

我有这段代码可以将用户名和密码发送到本地API(由于我仍在开发中,所以它现在是http,并且还不在服务器上)。但是,返回的数据只是响应代码,而不是响应的正文,该正文应包含auth-token。

这是客户端代码(我在SwiftUI中的应用):

func login(username:String, password:String){
    guard let url = URL(string: "http://localhost:3000/users/login") else { print("URL error"); return }
    var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10)
    let headers = [
        //"auth-token": "auth-token goes here",
        "accept": "string",
        "content-type": "application/json"]
    let body = [
        "username": username,
        "password": password]
    do{
    let dataToSend = try JSONSerialization.data(withJSONObject: body, options: .fragmentsAllowed)
        request.httpBody = dataToSend
    }catch{
        print("Error creating data object")
        return
    }
    request.allHTTPHeaderFields = headers
    request.httpMethod = "POST"
    let session = URLSession.shared
    let dataTask = session.dataTask(with: request) { (data, response, error) in
        // Check for erros
        if error == nil && data != nil{
            // Try parse out data
            print(data)
            do {
                let dictionary = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any]
                print(dictionary)
            }
            catch{
                print("Error parsing response data")
            }
        }
    }
    dataTask.resume()
}

当我在尝试将其放入字典之前打印出数据响应时,会得到以下信息: Optional(200 bytes)

我得到的是响应代码,而不是响应的主体(即json),为什么?

这是我的服务器端代码:

router.post('/login', async (req,res) => {

    // Validate before we login user
    const { error } = loginValidation(req.body);
    if (error) return res.status(400).send(error.details[0].message);

    // Checking if the user exists
    const user = await User.findOne({username: req.body.username});
    if(!user) return res.status(400).send("Invalid username")

    // Check if password is correct
    const validPass = await bcrypt.compare(req.body.password, user.password);
    if(!validPass) return res.status(400).send("Invalid password")

    console.log(req.body);
    // User is logged in provide them with a token
    const token = jwt.sign({
        _id: user._id,
        _username: user.username
    }, "SECRET_KEY", { expiresIn: '1h' });
    res.status(200).header('auth-token', token).send(token);
});

1 个答案:

答案 0 :(得分:1)

数据似乎不包含有效的JSON,这是您的代码未打印出您试图解析的dictionary的原因。查找响应数据的方法如下:

if let data = data {
    do {
        let dictionary = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:Any]
        print(dictionary)
    } catch {
        print("Error parsing response data: \(String(decoding: data, as: UTF8.self))")

    }
}