类型错误:res.status 不是函数

non*_*oom 10 javascript api node.js promise express

我正在制作一个允许我在我的 express api(nodejs)中将图片上传到 imgur 的函数,在调用返回承诺的函数时遇到错误:

类型错误:res.status 不是 uploadpicture.then 的函数

这是我的代码: 引发错误的地方:

  router.post('/upload', (req, res, next)=> { 
    var busboy = new Busboy({headers: req.headers});
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
        if(fieldname == 'image') {
            // the buffer
            file.fileRead = [];
            file.on('data', function(data) {
                // add to the buffer as data comes in
                this.fileRead.push(data);
            });

            file.on('end', function() {
                // create a new stream with our buffered data
                var finalBuffer = Buffer.concat(this.fileRead);
                upload = uploadpicture(finalBuffer).then((res)=>{ //success request
                  console.log(res);
                  res.status(200).json({success: true, message: "Successfully uploaded !", url: res.data.link});
                },(err)=>{ //error
                  res.status(500).json({success: false, message: "Error happenned while uploading !"});
                }).catch((error)=>{
                  console.log(error);
                  res.status(500).json({success: false, message: "Error happenned while uploading !"});
                });

            })
        }
    });
    busboy.on('finish', function() {
        //busboy finished
    });
    req.pipe(busboy);
});
Run Code Online (Sandbox Code Playgroud)

和功能:

function uploadpicture(stream){ //get picture stream
    return new Promise((resolve, reject)=>{
    var options = {
      uri: 'https://api.imgur.com/3/image',
      method: 'POST',
      headers: {
          //'Authorization': 'Client-ID ' + config.client_id_imgur // put client id here
      },
      formData: {
          image: stream,
          type: 'file'
      },
      auth: {
        bearer: config.access_token_imgur,
      }
  };

  request(options)
      .then((parsedBody)=> {
          resolve(parsedBody);
      })
      .catch((err)=> {
        console.log(err);
        reject(err.toString())
      });
    });
  }
Run Code Online (Sandbox Code Playgroud)

该代码运行良好,但我不知道为什么会突然发生此错误,我尝试:

将箭头函数更改为 function(){} 在路由参数旁边添加

没有任何效果,感谢您的帮助

小智 36

接受的答案直接解决了OP的问题,但我发布了另一个解决方案,因为您也可能在其他地方遇到此错误。

当你有:

api.use((error: ErrorRequestHandler, request: ExpressRequest, response: ExpressResponse) => {
  response.status(500).end() // response.status is not a function
})
Run Code Online (Sandbox Code Playgroud)

因为错误处理路由必须接受 Express 的 4 个参数才能将其标识为错误中间件。

api.use((error: ErrorRequestHandler, request: ExpressRequest, response: ExpressResponse, next: NextFunction) => {
  response.status(500).end()
})
Run Code Online (Sandbox Code Playgroud)

只需添加下一个函数(或您缺少的任何参数)即可修复它。

https://github.com/visionmedia/supertest/issues/416#issuecomment-514508137


小智 12

这一点:

upload = uploadpicture(finalBuffer).then((res)=>{ //success request
Run Code Online (Sandbox Code Playgroud)

theres是 promiseuploadpicture函数的结果(即parsedBody),而不是res来自 express 路由的结果。所以确实,它没有任何status功能。尝试更改then回调名称,如:

upload = uploadpicture(finalBuffer).then((otherName)=>{ //success request
Run Code Online (Sandbox Code Playgroud)


小智 6

您收到此错误:

类型错误:res.status 不是函数

因为顺序(err, req, res, next)不应该(req, res, err, next),下面的例子

const errorHandler = (err, req, res, next) => {
    const statusCode = res.statusCode === 200 ? 500 : res.statusCode;
    res.status(statusCode)
    res.json({
        message : err.message,
        stack :process.env.NODE_ENV === 'production' ? null : err.stack, 
    })
}
Run Code Online (Sandbox Code Playgroud)