【问题标题】:Unable to save uploaded image to database in Hapi.js无法将上传的图像保存到 Hapi.js 中的数据库
【发布时间】:2019-09-20 23:12:18
【问题描述】:

我想使用 hapi.js 将上传的照片保存在 mongodb 中。但是我可以将照片上传到上传文件夹中,但我无法将其保存在数据库中。这是代码:

   server.route({
            method: 'POST',
            path: '/upload',
            config: {
                    payload: {
                        output: "stream",
                        parse: true,
                        allow: "multipart/form-data",
                        maxBytes: 2 * 1000 * 1000
                    }
                },

                  handler: async (req, h) => {

                    const response1 = handleFileUpload(req.payload.image);
                    console.log(response1);
                    return response1;

                  }
         });
const handleFileUpload = file => {
    return new Promise((resolve, reject) => {
      const filename = file.hapi.filename
      const data = file._data

      fs.writeFile(`./uploads/${filename}`, data, err => {
        if (err) {
          reject(err)
        }
        resolve({
          message: 'Upload successfully!',
          imageUrl: `${server.info.uri}/uploads/${filename}`
        })
      })
    })
  }

因为它发送响应消息和 imageUrl。我必须将该 imageurl 保存在数据库中,但我不知道如何从承诺返回中访问它。我很新的承诺。 这是我的模型架构:

const stuSchema = new Schema({
    image : String,
});

html:

   <form method="post" action="/upload" enctype="multipart/form-data">

            <label for="image">Image Upoahhd</label>
            <input name="image" type="file" required >

            <br><br>
            <input type="submit" value="Login">
        </form>

我不知道如何将 req.payload.image 的值保存到数据库中。我想在 handler 方法上这样做:

const user = new User (imageUrl);
const sav = user.save();
return h.response(sav)

但我想将它们写在解析器函数上,但它接受对象

【问题讨论】:

标签: javascript node.js mongodb async-await hapijs


【解决方案1】:

您需要使用awaithandleFileUpload 函数从Promise 对象中获取数据,然后您可以在下面使用save() 函数在数据库中创建文档。

handler: async (req, reply) => {
  try {
    const { imageUrl } = await handleFileUpload(req.payload.image);
    const user = new User ({ image: imageUrl });
    const result = user.save();
    return ({ message: 'Saved Successfully' });
  } catch (err) {
    throw err
  }
}

const handleFileUpload = file => {
  return new Promise((resolve, reject) => {
    const filename = file.hapi.filename;
    const data = file._data;

    return fs.writeFile(`./uploads/${filename}`, data, err => {
      if (err) {
        return reject(err)
      }
      return resolve({
        message: "Upload successfully!",
        imageUrl: `${server.info.uri}/uploads/${filename}`
      })
    })
  })
}

【讨论】:

  • 只有一些 id 被保存到数据库中,但没有 imageUrl 进入数据库。我已经按照 hapi 新版本将return reply({ message: 'Saved Successfully' }) 编辑到了这个return reply.response(sav)
  • @InsaneDA 更新了我的答案。您只需要使用相同的字段image 保存即可。
  • 它成功了,谢谢。但是对您的代码return reply({ message: 'Saved Successfully' }) 进行修复后,它会给出TypeError reply is not a function。使用新的 API,您不必使用响应工具包来返回文本 response ,您可以简单地从处理程序返回文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2013-04-26
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多