cURL 语法错误:意外的标记 ' JSON 中的位置 0<br>

Mar*_*ano 3 curl node.js express

当我curl -X POST -H "Content-Type:application/json" http://localhost:3000/messages -d '{"text":"Hi again, World"}'在 cURL 上对 Express 执行此请求时,出现此错误

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <title>Error</title>
    </head>
    <body>
    <pre>SyntaxError: Unexpected token &#39; in JSON at position 0<br> &nbsp; &nbsp;at JSON.parse (&lt;anonymous&gt;)<br> &nbsp; &nbsp;at createStrictSyntaxError (C:\Users\Atom\node_modules\body-parser\lib\types\json.js:158:10)<br> &nbsp; &nbsp;at parse (C:\Users\Atom\node_modules\body-parser\lib\types\json.js:83:15)<br> &nbsp; &nbsp;at C:\Users\Atom\node_modules\body-parser\lib\read.js:121:18<br> &nbsp; &nbsp;at invokeCallback (C:\Users\Atom\node_modules\raw-body\index.js:224:16)<br> &nbsp; &nbsp;at done (C:\Users\Atom\node_modules\raw-body\index.js:213:7)<br> &nbsp; &nbsp;at IncomingMessage.onEnd (C:\Users\Atom\node_modules\raw-body\index.js:273:7)<br> &nbsp; &nbsp;at IncomingMessage.emit (events.js:327:22)<br> &nbsp; &nbsp;at endReadableNT (internal/streams/readable.js:1327:12)<br> &nbsp; &nbsp;at processTicksAndRejections (internal/process/task_queues.js:80:21)</pre>
    </body>
    </html>

Run Code Online (Sandbox Code Playgroud)

我不知道我做错了什么,因为我只是复制粘贴教程中的内容。我进行了搜索,在curl请求上找不到任何语法错误,但这仍然是错误的原因,我知道'是单引号(')。任何帮助将不胜感激。我的 app.js 文件:

var express = require('express');
var app = express();
const { v4: uuidv4 } = require('uuid');
require('dotenv').config();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

let users = {
    1: {
        id: '1',
        username: 'Robin Wieruch',
    },
    2: {
        id: '2',
        username: 'Dave Davids',
    },
};

let messages = {
    1: {
        id: '1',
        text: 'Hello World',
        userId: '1',
    },
    2: {
        id: '2',
        text: 'By World',
        userId: '2',
    },
};


app.get('/users', (req, res) => {
    return res.send(Object.values(users));
});

app.get('/users/:userId', (req, res) => {
    return res.send(users[req.params.userId]);
});

app.post('/messages', (req, res) => {
    const id = uuidv4();
    const message = {
        id,
        text: req.body.text
    };

    messages[id] = message;

    return res.send(message);
});

app.get('/messages', (req, res) => {
    return res.send(Object.values(messages));
});

app.get('/messages/:messageId', (req, res) => {
    return res.send(messages[req.params.messageId]);
});


app.post('/users', (req, res) => {
    return res.send('POST HTTP method on user resource');
});

app.put('/users/:userId', (req, res) => {
    return res.send(
        `PUT HTTP method on user/${req.params.userId} resource`,
    );
});

app.delete('/users/:userId', (req, res) => {
    return res.send(
        `DELETE HTTP method on user/${req.params.userId} resource`,
    );
});

app.listen(process.env.PORT, () =>
    console.log(`Example app listening on port ${process.env.PORT}!`),
);
Run Code Online (Sandbox Code Playgroud)

gfm*_*ore 6

进一步的调查表明,如果您使用的是 Windows cmd 终端,您可能需要转义双引号并避免单引号,因此例如在 git bash 上,以下工作

curl -X POST -H "Content-Type:application/json" -d '{"route": "Test route"}' http://192.168.1.xx:xxxx/
Run Code Online (Sandbox Code Playgroud)

但在 Windows cmd 上不行。为此我使用了:

curl -X POST -H "Content-Type:application/json" -d "{\"route\": \"Test route\"}" http://192.168.1.xx:xxxx/
Run Code Online (Sandbox Code Playgroud)

注意将xx xxxx改为你自己的url、端口

此见解的来源是 https://github.com/biofects/Google-Home-Messages/issues/3

戈登