javascript TypeError:资源状态不是函数

fiei3ece  于 2023-01-01  发布在  Java
关注(0)|答案(5)|浏览(137)

我正在做一个函数,允许我在express api(nodejs)中上传图片到imgur,当我调用一个返回承诺的函数时,我遇到了一个错误:
TypeError:res. status不是uploadpicture上的函数。则
这是我的代码:出现错误时:

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);
});

和功能:

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())
      });
    });
  }

代码工作完美,但我不知道为什么突然发生这个错误,我试图:

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

什么都没起作用,谢谢你的帮助

pxy2qtax

pxy2qtax1#

公认的答案直接解决了OP的问题,但我发布了另一个解决方案,因为您也可以在其他地方遇到这个错误。
当您有:

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

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

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

只需添加下一个函数(或任何缺少的参数)就可以修复它。
https://github.com/visionmedia/supertest/issues/416#issuecomment-514508137

ryhaxcpt

ryhaxcpt2#

此时:

upload = uploadpicture(finalBuffer).then((res)=>{ //success request

res是promise uploadpicture函数(即parsedBody)的结果,而不是来自快速路由的res。因此,它确实没有status函数。请尝试将then回调名称更改为:

upload = uploadpicture(finalBuffer).then((otherName)=>{ //success request
ldioqlga

ldioqlga3#

您将收到此错误:
TypeError:资源状态不是函数
由于顺序应为(err, res, req, 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, 
    })
}
zpqajqem

zpqajqem4#

参数的顺序真的很重要,我在下面的代码中有错误

const getImagesByBrand = async (res) => {
  try {
    const images = await Image.find();
    res.status(200).json(images);
  } catch (error) {
    res.status(500).json(error);
  }
};

我没有把req作为参数,这就是错误的原因,我只是添加req、res,它就工作了

1cosmwyk

1cosmwyk5#

如果使用的是async/await方法:

const notifications = await notifications.aggregate({...})
if(notifications){
  return res.status(200).json({ data: notifications })
}else{
  return res.status(404).json({ message: 'No notifications found'})
}

**确保包含return语句。**不包含return语句将导致此问题。我所做的其他事情是使用JSON而不是json,这肯定会引发错误。

相关问题