我可以在 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
})
}
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
})
}