-1

我正在尝试通过 NodeJS 和 Express 创建简单的 REST API,一切正常,但无法将 JSON 数据发布到 API。body-parser 无法解析 JSON 数据

curl -XPOST -H "Content-type: application/json" 127.0.0.1:3000/contact -d "{'name':'Mazhar'}"

这是代码

const express = require("express");
const bodyParser = require("body-parser");
const app = express();
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.post('/contact', (req, res) => {
    let body = req.body;
    console.log(body);

    body.message = "Hello " + body.name;
    res.send(body);
});
app.listen(3000, () => {
    console.log("Server is listening on 3000");
});

这是错误,无论我如何更改 JSON 正文,它总是一个错误,我也尝试输入双引号,并且任何单引号或双引号总是有错误,根据我的理解,应用程序无法解析json数据。

SyntaxError: Unexpected token ' in JSON at position 0
    at JSON.parse (<anonymous>)
    at createStrictSyntaxError (E:\ws-js\nodejs\web-server\node_modules\body-parser\lib\types\json.js:158:10)
    at parse (E:\ws-js\nodejs\web-server\node_modules\body-parser\lib\types\json.js:83:15)
    at E:\ws-js\nodejs\web-server\node_modules\body-parser\lib\read.js:121:18
    at invokeCallback (E:\ws-js\nodejs\web-server\node_modules\raw-body\index.js:224:16)
    at done (E:\ws-js\nodejs\web-server\node_modules\raw-body\index.js:213:7)
    at IncomingMessage.onEnd (E:\ws-js\nodejs\web-server\node_modules\raw-body\index.js:273:7)
    at IncomingMessage.emit (events.js:203:15)
    at endReadableNT (_stream_readable.js:1145:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)

解决方案

好吧,在应用了多种技术之后,我终于意识到在这种特殊情况下,单引号根本不起作用,唯一对我有用的解决方案是由@AfridaAnzum 提供的。

每件事都应该用双引号括起来,所有属性和值也应该用转义的双引号 "{\"key\":\"value\"}"

我猜这是一个写得很糟糕的库,它无法处理带单引号或不带引号的键。

4

2 回答 2

1

因为您的 JSON 语法无效:

{'name':'Mazhar'}
 ^
 '--------- invalid token '

虽然JSON受到javascript对象文字语法的启发,但它并不是一回事。JSON 是Douglas Crockford发明的 javascript 对象文字语法的子集,当时他想在他的项目中使用 javascript 对象表示法,并被他的经理告知他只能使用标准协议。因此,他为数据格式编写了一个规范,并将其命名为 JSON。

JSON 的规范可以在https://www.json.org找到

JSON 专门设计为比 javascript 对象字面量语法更严格,以使其更容易在其他语言(尤其是 C 等低级语言)中实现

于 2019-09-12T06:39:26.647 回答
0

JSON 数据键值应该用双引号括起来,否则会出现解析错误。例如:'{"name": "Mazhar"}' 尝试运行以下代码:

 curl -H "Content-Type: application/json" -XPOST http://localhost:3000/contact -d '{"name":"Mazhar"}'
于 2019-09-12T06:31:23.170 回答