【问题标题】:Unhandled Promise rejection warning: TypeError: First argument must be a string or Buffer未处理的承诺拒绝警告:TypeError:第一个参数必须是字符串或缓冲区
【发布时间】:2017-12-14 05:51:33
【问题描述】:

问题似乎是重复的,但我从过去 3 小时开始一直在努力解决这个问题。基本上我使用supertestmocha 来测试我的API。 我无法理解哪个承诺没有得到解决。

app.post('/todos', (req, res) => {
 var todo = new Todo({
 text : req.body.text
});
 todo.save().then( (doc) => {
  res.status(200).send(doc)
  }, (e) => {
  res.status(400).end(e);
 });
});

以下是我写的测试:

const expect = require('expect');
const request = require('supertest');

var {app} = require('./../server');
var {Todo} = require('./../models/todo');

// Setup database 
beforeEach((done) => {
  Todo.remove({})
 .then(() => done())
 .catch((e)=> done(e));
}); 

describe('Post /todos', () => {
it('should create a new todo', (done) => {

var text = 'Testing text';

// supertest to get, post
request(app)
  .post('/todos')
  .send({text}) // Automatic conversion to json - ES6
  .expect(200) // assertions
  .expect((res) => { // custom parsing
    expect(res.body.text).toBe(text);
  })
  .end((err, res) => {  // done directly accepted, but rather let's be more precise now - check mongodb
    if (err) {
      return done(err);
    }
    Todo.find()
      .then((todos) => {
        expect(todos.length).toBe(1);
        expect(todos[0].text).toBe(text);
        done();
      })
      .catch((e) => done(e));
  });
 });
});

请帮助解决这个问题。 这是整个错误消息:

mocha 服务器/**/*.test.js 监听端口:3000 发布/待办事项 (节点:1882)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:1):TypeError:第一个参数必须是字符串或缓冲区 (节点:1882)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。 1)应该创建一个新的待办事项 0 次通过(2s) 1 次失败 1)发布/待办事项应该创建一个新的待办事项: 错误:超过 2000 毫秒的超时。对于异步测试和钩子,确保调用了“done()”;如果返回 Promise,请确保它已解决。

【问题讨论】:

    标签: javascript node.js mocha.js es6-promise supertest


    【解决方案1】:

    express 中的end 函数只接受字符串或缓冲区,而不接受对象(请参阅https://expressjs.com/en/api.html#res.endhttps://nodejs.org/api/http.html#http_response_end_data_encoding_callback)。

    但是,看起来todo.save() 使用对象调用reject,这意味着e 导致TypeError。因为这是捕获 Promise 拒绝的错误,所以该错误包含在 Unhandled Promise Rejection 警告中。

    假设e{ message: "First argument must be a string or Buffer" },新代码可能是:

     todo.save().then( (doc) => {
      res.status(200).send(doc)
      }, (e) => {
      res.status(400).end(e.message);
     });
    

    todo.save() 承诺被拒绝的原因可能是因为待办事项中的text 似乎未定义。这是分配给 req 的 JSON:

    {
      text: 'Testing text'
    }
    

    但是,应该是这样的:

    {
      body: {
        text: 'Testing text'
      }
    }
    

    如果您将发送更改为以下内容,则应修复测试:

    .send({ body: { text }) // Automatic conversion to json - ES6
    

    【讨论】:

    • 很抱歉,这个帖子太老了,我无法重新生成之前发生的错误。也许,我今天尝试了以前的代码。成功了,不知道为什么!事实上,由于上​​述原因。我会接受你的回答并关闭这个帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多