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:意外令牌 -的主要内容,如果未能解决你的问题,请参考以下文章

bodyParser中间件的研究

bodyParser在node中被弃用解决办法

`app.use(bodyParser.json())` 有啥作用?

为啥 bodyParser 返回未定义?

玩转Koa -- koa-bodyparser原理解析

带有 JSON 的 bodyParser 问题