Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js JSONSerialization生成不正确的JSON对象。敏捷的_Node.js_Json_Swift - Fatal编程技术网

Node.js JSONSerialization生成不正确的JSON对象。敏捷的

Node.js JSONSerialization生成不正确的JSON对象。敏捷的,node.js,json,swift,Node.js,Json,Swift,我正在创建一个连接到NodeJS服务器的iOS应用程序。get方法工作正常,但POST方法存在问题 var urlRequest = URLRequest(url: "http://localhost:3000/register") urlRequest.httpMethod = "POST" let info: [String:Any] = ["username": "username", "password":"username", "email":"username@username.co

我正在创建一个连接到NodeJS服务器的iOS应用程序。get方法工作正常,但POST方法存在问题

var urlRequest = URLRequest(url: "http://localhost:3000/register")
urlRequest.httpMethod = "POST"
let info: [String:Any] = ["username": "username", "password":"username", "email":"username@username.com"]
do {
    let jsonInfo = try 
    JSONSerialization.data(withJSONObject: info, options[])
    urlRequest.httpBody = jsonInfo
} catch {
    print("ERROR")
    return
}
请求已发送,但JSONSerialization出现问题,因为这是服务器获取的JSON数据:
{{“电子邮件”:username@username.com“,”用户名“:”用户名“,”密码“:”用户名“}”:“'}

这就是我想要的:
{“电子邮件”:username@username.com“,”用户名“:”用户名“,”密码“:”用户名“}

这是服务器代码的一部分:

const express = require('express');
const bodyParser = require('body-parser');
var app = express();
var allowMethods = function(req, res, next) {
res.header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE');
next();
}
http.createServer(app).listen(3001);
console.log("Server started");
app.use(bodyParser.urlencoded({extended: true}));
app.use(allowMethods);

const _ = require('lodash');
let b = _.pick(req.body, ['username', 'password', 'email']);
你知道我做错了什么吗?如果可能的话,我想避免使用alamofire。我尝试过更改字典的格式,但结果总是:

{ 'the whole dictionary is the key': ''}
我也尝试过使用pretty print,结果是:

{ '{\n  "email" : "username@username.com",\n  "username" : "username",\n  "password" : "username"\n}': '' }
感谢您的帮助。谢谢大家!

编辑:

我试过迈克·塔凡纳的建议。 我将服务器代码改为使用此代码:

app.use(bodyParser.json());
但我从模拟器收到一个空的身体。 我还在swift代码中添加了以下内容:

urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.addValue("application/json", forHTTPHeaderField: "Accept")

但是服务器也会收到一个空的主体,我所说的空主体是指我试图发送的数据被服务器接收为空的。当我检查httpBody时,数据在那里,但由于某种原因服务器没有接收到它。

我相信您的Swift代码是正确的。当我在操场上做这件事时:

print(String(data: urlRequest.httpBody!, encoding: String.Encoding.utf8)!)
它印刷了:

{"username":"username","password":"username","email":"username@username.com"}
我不是主体解析器方面的专家,但我认为:

bodyParser.urlencoded({extended: true})
您应该使用以下选项:

bodyParser.json([options]) //not sure which options exactly you need

您可能还需要设置
内容类型:application/json
标题。有关更多信息,请参阅。我通过更改数据本身解决了此问题。我没有强迫它传递JSON,而是将其作为使用UTF8编码的字符串传递

let dataString = "username=username&password=username&email=username@username.com"
urlRequest.httpBody = dataString.data(using: .utf8)
我用这篇文章中的方法得到了答案:

您可以使用Codable进行Json解析。它易于使用且灵活。我尝试使用bodyParser.json()和不同的选项,并设置头,例如urlRequest.addValue(“application/json”,forHTTPHeaderField:“Content Type”)urlRequest.addValue(“application/json”,forHTTPHeaderField:“Accept”)。我混合并匹配了这些更改,但每次我进行任何更改时,我的服务器都会收到一个空正文{}。