BodyParser:意外令牌 -
Posted
技术标签:
【中文标题】BodyParser:意外令牌 -【英文标题】:BodyParser: Unexpected Token - 【发布时间】:2017-03-15 19:55:37 【问题描述】:我实际上正在开发一个带有文件上传和一些数据的 Angular 网络表单。 以下是请求标头:
POST /tests/add HTTP/1.1
Host: localhost:3000
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Content-Type: application/json;charset=utf-8
Referer: http://localhost:8000/
Content-Length: 2033
我以这种方式构建请求:
var formData = new FormData();
formData.append('file', $scope.test.file);
$http(
method: 'POST',
url: backUrl + '/tests/add',
data: 'file': $scope.file,
'token': 'test',
contentType: false,
processData: false,
transformRequest: function (data, headersGetter)
var formData = new FormData();
angular.forEach(data, function (value, key)
formData.append(key, value);
);
var headers = headersGetter();
delete headers['Content-Type'];
return formData;
但它总是返回 400 错误请求并出现此错误:
Unexpected token -
400
SyntaxError: Unexpected token -
at parse (/home/me/projects/www/node_modules/body-parser/lib/types/json.js:83:15)
at /home/me/projects/www/node_modules/body-parser/lib/read.js:116:18
at invokeCallback (/home/me/projects/www/node_modules/raw-body/index.js:262:16)
at done (/home/me/projects/www/node_modules/raw-body/index.js:251:7)
at IncomingMessage.onEnd (/home/me/projects/www/node_modules/raw-body/index.js:307:7)
at emitNone (events.js:86:13)
at IncomingMessage.emit (events.js:185:7)
at endReadableNT (_stream_readable.js:974:12)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
这是我在后端唯一对 bodyParser 的引用:
app.use(bodyParser.json()); // to support JSON-encoded bodies
app.use(bodyParser.urlencoded( // to support URL-encoded bodies
extended: true,
defer: true
));
我做错了什么?
【问题讨论】:
【参考方案1】:您确定要发送 JSON 吗?
您很可能使用了无效的 JSON,这会导致 bodyParser.json() 出错。
确保您使用的是有效的 JSON。您还可以将 bodyParser.json 与 bodyParser.raw 交换为中间件。
【讨论】:
我不确定你的意思,如果你问的是 wjat,我不会发送 JSON 文件 好的,所以我从 .json 切换到 .raw 并且错误不再发生。但是,现在 req.body 总是空的,那么我如何在 bodyparser.raw 之后访问请求参数? 抱歉,我说要使用它,以便您确认发送的内容。我建议通过检查标题和正文中实际发送的内容来确保正确发送 JSON。但这里有一个关于 bodyparser.raw 的 goog 链接:***.com/questions/18710225/… 你节省了我的时间。谢谢。 刚刚遇到一个问题,在我的发布请求中,我没有发送有效的 JSON,而只是发送了一个字符串值。【参考方案2】:确保您的请求正文 JSON 有效,如果您想阻止它在后端使用以下代码。
NodeJS 默认无法处理无效的 JSON 正文,如果您输入错误的 JSON 正文 raw JSON 则会遇到以下错误。
SyntaxError: Unexpected token in JSON at position 75 在 JSON.parse
为了防止错误,我们可以使用中间件来解决所有 API 的问题。
app.use((err, req, res, next) =>
// This check makes sure this is a JSON parsing issue, but it might be
// coming from any middleware, not just body-parser:
if (err instanceof SyntaxError && err.status === 400 && 'body' in err)
console.error(err);
return res.status(400).json(status: false, error: 'Enter valid json body'); // Bad request
next();
);
【讨论】:
以上是关于BodyParser:意外令牌 -的主要内容,如果未能解决你的问题,请参考以下文章