我可以在 nextjs 中使用没有 express 的 multer 吗?

Can i use multer without express in nextjs?

import type { NextApiRequest, NextApiResponse } from 'next'
import multer from 'multer'
const upload = multer({ dest: 'public/uploads/' })

export default async (req: any, res: NextApiResponse) => {
  // Swith case method
  switch (req.method) {
    // Case 'POST' for auth
    case 'POST':
      try {
        upload.single('image')
        res.status(201).json('ok')
      } catch (err) {
        console.log(err)
      }

      return

      break
    default:
      break
  }
}

我没用过express route,所以不知道上面代码片段中的Middleware怎么调用。

是的,它在本地运行良好,但是当您在 Vercel 上部署时,它不起作用,这肯定是由于 Nextjs 的无服务器性质。你可以用 formidable-serverless 替换它,它在本地和 Vercel 上的生产中都运行良好。

import formidable from 'formidable-serverless';


export default async(req, res) => {
  const form = new formidable.IncomingForm();
  form.keepExtensions = true;

  form.parse(req, async (err, fields, files) => {
    if (err) {
      return res.status(400).json({ message: err });
    }

    return res.json(files);
  });
}

并且不要忘记导出配置对象

export const config = {
  api: {
    externalResolver: true,
  },
}

为了避免this警告

是的,如果您模仿它的中间件环境,您可以使用 multer 来解析传入的请求。使用示例:

pages/api/formWithFiles.js
import multer from 'multer'

// disable next.js' default body parser
export const config = {
  api: { bodyParser: false }
}

export default async function handler(req, res) {
  await new Promise(resolve => {
    // you may use any other multer function
    const mw = multer().any()

    //use resolve() instead of next()
    mw(req, res, resolve)
  })

  // example response
  res.status(200).json({
    body: req.body,
    files: req.files
  })
}