在 NextJS 中的 Formidable 的 parse() 中使用 Mongoose save() API

Using Mongoose save() inside Formidable's parse() inside NextJS API

我在我的 NextJS 应用程序中使用 formidable 包和 mongoose。所以我写了 API 调用来允许用户上传照片和一些数据。我使用 formidable 处理文件并且工作正常。但是在处理文件之后,我需要通过 mongoose 向我的 MongoDB 插入一些数据,然后 return API 响应。如果我在 mongoose 的 save() 方法上使用 await 来保存数据,它会抛出错误,指出 parent 需要是异步函数。但就我而言,parent 是 form.parse()

我对如何解决这个问题有点困惑。我认为在这里与 Promises 混淆了。

这是我的 /pages/api/submit.js 的精简代码:

import dbConnect from '../../lib/dbConnect'
import User from '../../models/User'
import formidable from 'formidable'

export default async function handler(req, res) {
    await dbConnect()

    if (req.method === 'POST') {

        const form = new formidable.IncomingForm();
        // some config
        form.uploadDir = './public/photos/';

        form.parse(req, (err, fields, files) => {
            //.. some logic

            if (err) {
                console.log('error parsing the file')

                return res.status(400).json( {
                    error: true,
                    msg: "Unable to parse the file"
                } )
            }

            // insert some data
            var user = new User( { name: 'blah', file_name: 'x', file_size: 'xx' } );
            //await user.save();
            user.save( err => {
                if( err ){
                    console.log( err )
                    return false
                }

                // success
                res.status(200).json( {
                    error: false,
                    msg: "success"
                } ).end()
            } )
        })
    }
}

只需将它从 callback-hell 中解开,这样你就有了一个漂亮的 async/await 代码

Live Demo



const asyncParse = (req) =>
  new Promise((resolve, reject) => {
    const form = new IncomingForm({ multiples: true });
    form.parse(req, (err, fields, files) => {
      if (err) return reject(err);
      // resolve "returns" the promise so you will have a straighforward logic flow
      resolve({ fields, files });
    });
  });

export default async function handler(req, res) {
  console.log("Receiving");
  if (req.method === "PUT") {
    const result = await asyncParse(req);
    // so you can use it here as a normal code flow
    res.status(200).json({ result });
  }
}

PS。为什么要进行死灵碰撞?这是第一个 Google 结果之一,抱歉