Node.js调用其他脚本方法报cannot find module错误如何解决
报错根因
Node.js 使用 ES 模块(import/export 语法)时,默认要求导入本地自定义文件时必须显式携带完整的文件扩展名,你当前的导入语句省略了 .js 后缀,导致系统无法匹配到对应文件。
解决方案
1. 修复 server.js 导入路由的语句
将 server.js 中路由导入行修改为带 .js 后缀的版本:
import redisRoute from './routes/routes.js';
2. 修复 routes.js 里的导入与导出不匹配问题
你当前 redisController.js 仅默认导出了 getAllKeysWithValue 一个方法,但是 routes.js 里尝试导入三个不同的方法,后续也会触发报错,需要同步调整:
第一步:修改 redisController.js 导出逻辑
将三个接口方法改为命名导出:
// getAllKeysWithValue 原有逻辑不变,修改导出方式 export const getAllKeysWithValue = async (req,res) => { client.keys('*', (err, keys)=> { if (err) return console.log(err); for(let i =0;i<keys.length;i++){ client.get(keys[i],function(err,data){ console.log(`key is ${keys[i]} and value is ${data}`); res.send("LOOK AT YOUR LOG :)") }) } }); } // 补充另外两个方法的定义和导出 export const getRedisValue = async (req, res) => { // 你的查询单条redis值的逻辑 } export const postRedisValue = async (req, res) => { // 你的写入redis值的逻辑 }
第二步:修改 routes.js 导入语句,补充 .js 后缀
把原来的三行导入合并为批量命名导入:
import { getAllKeysWithValue, getRedisValue, postRedisValue } from "../controllers/redisController.js";
其他潜在问题修复
你当前的 getAllKeysWithValue 方法存在逻辑缺陷:循环内每次查询到key的值就调用 res.send,第二次调用时会触发「响应头已发送到客户端」的报错,建议修改为收集所有结果后统一返回:
export const getAllKeysWithValue = async (req,res) => { client.keys('*', (err, keys)=> { if (err) return res.status(500).send(err.message); const keyValueMap = {} let completedCount = 0 // 空key直接返回 if(keys.length === 0) return res.send(keyValueMap) for(let i =0;i<keys.length;i++){ client.get(keys[i],function(err,data){ if (err) return res.status(500).send(err.message); keyValueMap[keys[i]] = data completedCount++ // 所有key查询完成后再统一返回 if(completedCount === keys.length){ console.log(keyValueMap) res.send(keyValueMap) } }) } }); }
内容的提问来源于stack exchange,提问作者Thymeleaf
相关产品推荐
相关产品推荐

