使用express-validator时遇模块导出命名不匹配的SyntaxError求助
问题:ES模块导入导出不匹配导致的SyntaxError
代码场景
验证文件(author.validator.js)代码:
import { check } from "express-validator"; exports.validateAuthor = [ check('name', 'name is required').not().isEmpty() ];
路由文件代码:
import { Router } from 'express'; import { getItems, getItem, createItem, updateItem, deleteItem } from '../controller/author.controller.js'; import { validateAuthor } from '../middleware/author.validator.js'; const router = Router(); router.route('/') .get((req,res) => getItems(req,res)) .post(validateAuthor, (req,res) => createItem(req,res)) .patch(validateAuthor, (req,res) => updateItem(req,res)) .delete((req,res) => deleteItem(req,res)); router.route(`/:id`) .get((req,res) => getItem(req,res)); export default router;
报错信息
SyntaxError: The requested module '../middleware/author.validator.js' does not provide an export named 'validateAuthor'
错误原因
你的项目使用ES模块语法(通过import/export可判断,且项目大概率在package.json中配置了"type": "module"),但验证文件用的是CommonJS的导出方式(exports.validateAuthor),两种模块规范不兼容,导致ES模块的命名导入无法识别CommonJS的导出项。
tutsmake的示例可能基于CommonJS规范(使用require/module.exports),和你的项目模块规范不一致。
解决方案
统一使用ES模块语法即可,有两种修改方式:
方式1:使用ES模块命名导出
修改验证文件的导出代码:
import { check } from "express-validator"; // 改用ES模块命名导出 export const validateAuthor = [ check('name', 'name is required').not().isEmpty() ];
路由文件的导入代码无需修改,保持原有的命名导入即可。
方式2:使用ES模块默认导出
修改验证文件:
import { check } from "express-validator"; const validateAuthor = [ check('name', 'name is required').not().isEmpty() ]; // 改用默认导出 export default validateAuthor;
同时修改路由文件的导入语句:
// 改为默认导入 import validateAuthor from '../middleware/author.validator.js';
内容的提问来源于stack exchange,提问作者Jhon Estrada
相关产品推荐
相关产品推荐

