‘ER_BAD_FIELD_ERROR: Unknown column ‘‘undefined’’ in ‘‘field list’’’
今天在写NodeJs后端时,在查询数据库出现了如下错误:
报错内容:
"ER_BAD_FIELD_ERROR: Unknown column 'undefined' in 'field list'"
解决方法
SQL语句出错,前端传送过来的数据存在空字段,导致SQL语句在查询数据库时出错。

res.cc is not a function
报错内容
TypeError: res.cc is not a function
at C:\Users\Administrator\Desktop\study\NodeJs\Demo\app.js:36:9
at Layer.handle_error (C:\Users\Administrator\Desktop\study\NodeJs\Demo\node_modules\express\lib\router\layer.js:71:5)
at trim_prefix (C:\Users\Administrator\Desktop\study\NodeJs\Demo\node_modules\express\lib\router\index.js:326:13)
at C:\Users\Administrator\Desktop\study\NodeJs\Demo\node_modules\express\lib\router\index.js:286:9
at Function.process_params (C:\Users\Administrator\Desktop\study\NodeJs\Demo\node_modules\express\lib\router\index.js:346:12)
at next (C:\Users\Administrator\Desktop\study\NodeJs\Demo\node_modules\express\lib\router\index.js:280:10)
at Layer.handle_error (C:\Users\Administrator\Desktop\study\NodeJs\Demo\node_modules\express\lib\router\layer.js:67:12)
at trim_prefix (C:\Users\Administrator\Desktop\study\NodeJs\Demo\node_modules\express\lib\router\index.js:326:13)
at C:\Users\Administrator\Desktop\study\NodeJs\Demo\node_modules\express\lib\router\index.js:286:9
at Function.process_params (C:\Users\Administrator\Desktop\study\NodeJs\Demo\node_modules\express\lib\router\index.js:346:12)
分析原因
TypeError: res.cc is not a function意思是找不到rec.cc()函数,那可能是:
rec.cc()中间件在注册路由后- 或者
res.cc()中间件在解析表单数据中间件后
解决办法
将res.cc()中间件放在解析表单数据中间件前即可
修改前
// 解析表单的数据中间件,只能解析application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: false }))
// 定义res.cc错误中间件,用于返回错误
app.use((req,res,next)=>{
// status = 0 为成功; status = 1 为失败; 默认将 status 的值设置为 1,方便处理失败的情况
res.cc = (err,status = 1,data=null)=>{
res.send({
status,
// 状态描述,判断 err 是 错误对象 还是 字符串
msg: err instanceof Error ? err.message : err,
data,
})
}
next()
})
修改后
// 定义res.cc错误中间件,用于返回错误
app.use((req,res,next)=>{
// status = 0 为成功; status = 1 为失败; 默认将 status 的值设置为 1,方便处理失败的情况
res.cc = (err,status = 1,data=null)=>{
res.send({
status,
// 状态描述,判断 err 是 错误对象 还是 字符串
msg: err instanceof Error ? err.message : err,
data,
})
}
next()
})
// 解析表单的数据中间件,只能解析application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: false }))
Cannot set headers after they are sent to the client
报错内容
Cannot set headers after they are sent to the client
原因
原因是服务端给客户端响应多条信息,导致出错
db.query(sql,userinfo.username,(err,results)=>{
if (err) return res.cc(err)
if (results.length > 0){
res.cc('用户名已被占用') // 第一次返回
}
const addSql = `insert into tb_user set ?`
db.query(addSql,{username:userinfo.username,password:userinfo.password},(err,results)=>{
if (err) return res.cc(err)
if (results.affectedRows !== 1) return res.cc('注册失败,请稍候再试')
res.cc('注册成功',0) // 第二次返回
})
})
解决问题
把多条信息响应修改一下,使服务端给客户端只响应一条信息即可。
db.query(sql,userinfo.username,(err,results)=>{
if (err) return res.cc(err)
if (results.length > 0){
return res.cc('用户名已被占用') // 增加一个return,这样出错直接给客户端返回信息不往下执行
}
const addSql = `insert into tb_user set ?`
db.query(addSql,{username:userinfo.username,password:userinfo.password},(err,results)=>{
if (err) return res.cc(err)
if (results.affectedRows !== 1) return res.cc('注册失败,请稍候再试')
return res.cc('注册成功',0)
})
})
‘ER_DATA_TOO_LONG: Data too long for column ‘‘password’’ at row 1’
报错内容
"ER_DATA_TOO_LONG: Data too long for column 'password' at row 1"
原因
数据库中password 写入的长度为300,但是password字段的长度只有200,因此报错

解决问题
将数据库中password字段的长度增大即可。
“Error: ‘expiresIn’ should be a number of seconds or string representing a timespan”
报错内容
C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\mysql\lib\protocol\Parser.js:437
throw err; // Rethrow non-MySQL errors
^
Error: "expiresIn" should be a number of seconds or string representing a timespan
at C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\jsonwebtoken\sign.js:52:15
at Array.forEach (<anonymous>)
at validate (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\jsonwebtoken\sign.js:43:6)
at validateOptions (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\jsonwebtoken\sign.js:58:10)
at Object.module.exports [as sign] (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\jsonwebtoken\sign.js:141:5)
at Query.<anonymous> (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\router_handler\user.js:71:30)
at Query.<anonymous> (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\mysql\lib\Connection.js:526:10)
at Query._callback (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\mysql\lib\Connection.js:488:16)
at Query.Sequence.end (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24)
at Query._handleFinalResultPacket (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\mysql\lib\protocol\sequences\Query.js:149:8)
解决问题
我在config.js文件创建了expriresIn:'10h'全局变量,但是在user.js引用却失败了,将config.expriresIn改为'10h'就没问题了。猜测应该是将变量引入之后不是字符串了,解析成其他格式,导致引发错误。
原代码:
// 这是全局的配置文件
module.exports = {
// 加密和解密token的密钥
jwtSecretKey : 'lilbai518',
// token的有效期10小时
expriresIn: '10h'
}
const tokenStr = jwt.sign(user,config.jwtSecretKey,{expiresIn: config.expriresIn})
修改后代码:
const tokenStr = jwt.sign(user,config.jwtSecretKey,{expiresIn: '10h'})
request entity too large
报错内容
request entity too large
原因分析

我在请求中加入了图片请求,可能是图片占用太大,导致请求失败
解决办法
降低请求体大小即可,将图片压缩后后再请求。
“NodeJs报错 throw new typeerror(‘app.use() requires a middleware function’)”
错误
C:\Users\Administrator\Desktop\学习\NodeJs\day05\node_modules\express\lib\application.js:210
throw new TypeError('app.use() requires a middleware function')
^
TypeError: app.use() requires a middleware function
at Function.use (C:\Users\Administrator\Desktop\学习\NodeJs\day05\node_modules\express\lib\application.js:210:11
at Object.<anonymous> (C:\Users\Administrator\Desktop\学习\NodeJs\day05\03路由模块化.js:9:5)
at Module._compile (internal/modules/cjs/loader.js:1085:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
at Module.load (internal/modules/cjs/loader.js:950:32)
at Function.Module._load (internal/modules/cjs/loader.js:790:12)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
at internal/main/run_main_module.js:17:47
[nodemon] app crashed - waiting for file changes before starting...
原因
是我的路由模块的导出module加了花括号,去掉花括号就没问题了

‘Error: Cannot find module ‘‘xxx’’’
报错内容
internal/modules/cjs/loader.js:905
throw err;
^
Error: Cannot find module 'express'
Require stack:
- C:\Users\Administrator\Desktop\学习\NodeJs\day06\express写接口.js
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902:15)
at Function.Module._load (internal/modules/cjs/loader.js:746:27)
at Module.require (internal/modules/cjs/loader.js:974:19)
at require (internal/modules/cjs/helpers.js:93:18)
at Object.<anonymous> (C:\Users\Administrator\Desktop\学习\NodeJs\day06\express写接口.js:2:17)
at Module._compile (internal/modules/cjs/loader.js:1085:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
at Module.load (internal/modules/cjs/loader.js:950:32)
at Function.Module._load (internal/modules/cjs/loader.js:790:12)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12) {
code: 'MODULE_NOT_FOUND',
requireStack: [
'C:\\Users\\Administrator\\Desktop\\学习\\NodeJs\\day06\\express写接口.js'
]
}
[nodemon] app crashed - waiting for file changes before starting...
分析错误
找不到express模块
- 看看导入模块有没有出错
- 看看
package.json有没有下载包记录
发现package.json没有记录express,说明是是没有下载,那重新下载一下包就好了,npm i express
Error: Cannot find module 'express'
Syntax Error: TypeError: Cannot read properties of undefined (reading ‘parseComponent’)
报错内容
Syntax Error: TypeError: Cannot read properties of undefined (reading 'parseComponent')
错误分析
无法读取未定义的属性(“parseComponent”),可能我的vue版本和vue-template-compiler不一致导致,那么,先卸载vue-template-compiler,再安装vue-template-compiler和vue版本一致即可。
解决办法
查看vue版本
npm list vue
得到ue版本信息x.x.x
安装vue-template-compiler
将vue的版本号填入以下的x.x.x
npm install vue-template-compiler@x.x.x
“解决Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client”
错误
C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\mysql\lib\protocol\Parser.js:437
throw err; // Rethrow non-MySQL errors
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at new NodeError (internal/errors.js:322:7)
at ServerResponse.setHeader (_http_outgoing.js:561:11)
at ServerResponse.header (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\express\lib\response.js:771:10)
at ServerResponse.send (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\express\lib\response.js:170:12)
at ServerResponse.json (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\express\lib\response.js:267:15)
at ServerResponse.send (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\express\lib\response.js:158:21)
at Query.<anonymous> (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\router_handler\user.js:26:24)
at Query.<anonymous> (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\mysql\lib\Connection.js:526:10)
at Query._callback (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\mysql\lib\Connection.js:488:16)
at Query.Sequence.end (C:\Users\Administrator\Desktop\学习\NodeJs\TestDemo\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24) {
code: 'ERR_HTTP_HEADERS_SENT'
}
[nodemon] app crashed - waiting for file changes before starting...
解决前
// 定义sql语句,查询用户名是否被占用
const sqlStr = 'select * from ev_users where username=?'
db.query(sqlStr,[userinfo.username],(err,results)=>{
// 执行sql语句
if (err){
return res.send({status:1,msg:err.message})
}
// 判断用户名是否被占用
if (results.length > 0){
return res.send({status:1, msg:'用户名已被占用,请更换其他用户名'})
}
// TODO : 用户名可用,其他操作
})
res.send('reguser OK')
解决后
其实就是服务端同时给客户端重复响应两个消息,才会报错,因为在每一个if判断都响应了一个消息,if接受后我还是响应一个消息,那我响应的消息就是两个了,就报错了,所以把最后一个响应删掉就可以了
// 定义sql语句,查询用户名是否被占用
const sqlStr = 'select * from ev_users where username=?'
db.query(sqlStr,[userinfo.username],(err,results)=>{
// 执行sql语句
if (err){
return res.send({status:1,msg:err.message})
}
// 判断用户名是否被占用
if (results.length > 0){
return res.send({status:1, msg:'用户名已被占用,请更换其他用户名'})
}
// TODO : 用户名可用,其他操作
})
nodemon无法自动刷新内容变更
遇到问题
今天在写NodeJs的时候,发现nodemon没有自动更新内容变更,这让我很头疼,一开始以为是路径没有导入正确,再三排除,路径没有问题。
分析问题
这是我的项目框架,程序启动入口位于app/app.js
Demo
├─ app
│ └─ app.js
├─ config
│ ├─ db
│ │ └─ index.js
│ └─ schema
│ └─ user.js
├─ public
├─ router
│ ├─ router_handler
│ │ └─ user.js
│ └─ router_head
│ └─ user.js
├─ view
│ ├─ admin
│ └─ public
├─ package-lock.json
└─ package.json
导入路由时,需要返回上级目录,这时nodemon可能没有找到导入的路由,那么,我把程序入口app.js转移到根目录,应该就没问题了吧
解决问题
只需将app.js移到根目录即可
Demo
├─ config
│ ├─ db
│ │ └─ index.js
│ └─ schema
│ └─ user.js
├─ public
├─ router
│ ├─ router_handler
│ │ └─ user.js
│ └─ router_head
│ └─ user.js
├─ view
│ ├─ admin
│ └─ public
├─ app.js
├─ package-lock.json
└─ package.json
const userRouter = require('./router/router_head/user')
npm ERR! command failed
npm ERR! code 1
npm ERR! path E:\Cache\Vue\forum-vue-master\forum-vue-master\node_modules\node-sass
npm ERR! command failed
查看需要的node-sass的版本
在package.json文件中找到node-sass": "^版本号",记下版本号
根据node-sass的版本找到合适的node.js版本下载
| NodeJS | Supported node-sass version | Node Module |
|---|---|---|
| Node 16 | 6.0+ | 93 |
| Node 15 | 5.0 | 88 |
| Node 14 | 4.14+ | 83 |
| Node 13 | 4.13+,<5.0 | 79 |
| Node 12 | 4.12+ | 72 |
| Node 11 | 4.10+,<5.0 | 67 |
| Node 10 | 4.9+,<6.0 | 64 |
| Node 8 | 4.5.3+,<5.0 | 57 |
| Node <8 | <5.0 | <57 |
NodeJs旧版下载地址
NodeJs:https://registry.npmmirror.com/binary.html?path=node/
