Node.js 测试中的express body解析器utf-8错误

Node.js 测试中的express body解析器utf-8错误,node.js,express,postman,jestjs,body-parser,Node.js,Express,Postman,Jestjs,Body Parser,被这件事难住了。我有一些服务器代码,由于某种原因在测试中抛出UTF-8错误,但在正常运行服务器时工作正常: 代码: 用法(完全相同,但说笑,测试体解析器不能正常工作): 我使用的是邮递员,在测试之外发布响应: { "projects": [ { "id": "test", "active": true, "timestamp": "2018-02-25T21:33:08.006Z" }

被这件事难住了。我有一些服务器代码,由于某种原因在测试中抛出UTF-8错误,但在正常运行服务器时工作正常:

代码:

用法(完全相同,但说笑,测试体解析器不能正常工作):

我使用的是邮递员,在测试之外发布响应:

{
    "projects": [
        {
            "id": "test",
            "active": true,
            "timestamp": "2018-02-25T21:33:08.006Z"
        },
        {
            "id": "TEST-PROJECT",
            "active": true,
            "timestamp": "2018-03-05T21:34:34.604Z"
        },
        {
            "id": "asd",
            "active": true,
            "timestamp": "2018-03-06T23:29:55.348Z"
        }
    ],
    "total": 3
}
jest测试服务器内的意外post响应:

错误

UnsupportedMediaTypeError:unsupported字符集“UTF-8”
at/Users/awilmer/Projects/arranger/node_modules/body parser/lib/read.js:83:18
at invokeCallback(/Users/awilmer/Projects/arranger/node_modules/raw body/index.js:224:16)
at/u combinedTickCallback(internal/process/next_tick/next_tick.js:131:7)
at process.\(内部/流程/下一步勾选js:180:9)

因此,我能够重现问题,找到问题的根源和解决方法,使其发挥作用。问题是由
jest
框架引起的

在您开始阅读该线程的其余部分之前,我建议您阅读另一个我早就回答过的Jest线程。这将有助于获得有关
Jest
require
方法的一些上下文内部内容

原因

这个问题只发生在测试中,而不是在生产中。这是因为
jest
require方法

当您运行测试时,它会启动一个express服务器,该服务器调用
节点_modules/raw body/index.js
,如下图所示

如您所见,
编码
null
。这是因为
iconv-lite
模块延迟加载
编码
。编码仅在执行
getCodec
方法时加载

现在,当您的测试触发API时,服务器需要读取主体,以便调用
getCodec

然后执行
jest runtime/build/index.js
custom
require
方法(如果阅读前面的链接,该方法将被重载)

execModule
检查
this.\u environment.global
,在本例中为空,因此返回一个
null
值,模块永远不会执行

现在,当您查看
编码
模块的导出时,它只是一个空白对象

因此,这个问题纯粹是一个笑话。笑话缺少的功能或主要是一个bug

相关问题

相关问题已经在下面的线程中讨论过

修复

解决这个问题的办法是,我们在测试期间加载模块,并强制提前加载而不是延迟加载。这可以通过在顶部的
index.test.js
中添加一行来完成

import encodings from '../../node_modules/iconv-lite/encodings';
import createServer from '@arranger/server';
更改后,所有测试都将通过,尽管测试的url中有错误,因此您得到
无法发布/


我花了很多时间试图弄明白为什么Jest在测试Node.js服务器时会报告415错误代码。Node.js被配置为在我们的系统上使用
app.use(bodyParser.json(…);
。但这并没有解决问题

解决方案 当使用
res.status(…)
时,您必须链接
.json()
或也使用
res.json()
。这意味着如果您以500错误或其他方式响应,并且没有返回任何json数据,您仍然需要使用
res.json()
。不知道为什么,因为这违背了
app.use(bodyParser.json(…)的全部目的)
首先

例子
我添加了一个与@Tarun Lalwani略有不同的解决方案

在测试文件的顶部添加以下行

const encodings = require('./node_modules/iconv-lite/encodings');                                                                                                                                                                       
const iconvLite = require('./node_modules/iconv-lite/lib');                                                                                                                                                                             
iconvLite.getCodec('UTF-8');

已安装所有内容,测试全部通过,您是否尝试删除节点_模块,
npm cache clean
并重新安装所有内容?您使用哪个操作系统来测试此操作?我正在运行osx 10.12.6..nodejs 8.4。我将在另一个操作系统上尝试全新安装machine@azium,我可以复制你的问题,这里的问题只是开玩笑,不会的发生在其他框架中。我正在寻找可能的解决方案now@azium,发布了解决方案。看一看绝对精彩。这是我经历过的最好的业力。我一直在尝试创建一个小的可重复测试,找出问题所在。但这似乎是你发现的一个边缘案例。express和body解析器工作得很好在整个项目中使用延迟加载。您应该使用Jest打开一个问题,并向他们提供此repo和SO链接,以复制和修复问题的答案。我刚刚添加了
require('iconv-lite/encodings'))
到我的文件顶部,它神奇地工作。在那里,导入“../../node_modules/iconv lite/encodings”后,在哪里使用指定的变量,则不需要使用它,只需导入即可 UnsupportedMediaTypeError: unsupported charset "UTF-8"
at /Users/awilmer/Projects/arranger/node_modules/body-parser/lib/read.js:83:18
at invokeCallback (/Users/awilmer/Projects/arranger/node_modules/raw-body/index.js:224:16)
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
import encodings from '../../node_modules/iconv-lite/encodings';
import createServer from '@arranger/server';
const express = require('express');
const router = express.Router();

router.post("/register", (req, res) => {
  // ...
  res.status(500).json();
  // ...
});
const encodings = require('./node_modules/iconv-lite/encodings');                                                                                                                                                                       
const iconvLite = require('./node_modules/iconv-lite/lib');                                                                                                                                                                             
iconvLite.getCodec('UTF-8');