‘ER_BAD_FIELD_ERROR: Unknown column ‘‘undefined’’ in ‘‘field list’’’

今天在写NodeJs后端时,在查询数据库出现了如下错误:

报错内容:

1
"ER_BAD_FIELD_ERROR: Unknown column 'undefined' in 'field list'"

解决方法

SQL语句出错,前端传送过来的数据存在空字段,导致SQL语句在查询数据库时出错。

image-20220728223139526

res.cc is not a function

报错内容

1
2
3
4
5
6
7
8
9
10
11
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()函数,那可能是:

  1. rec.cc()中间件在注册路由后
  2. 或者res.cc()中间件在解析表单数据中间件后

解决办法

res.cc()中间件放在解析表单数据中间件前即可

修改前

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 解析表单的数据中间件,只能解析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()
})

修改后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 定义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

报错内容

1
Cannot set headers after they are sent to the client

原因

原因是服务端给客户端响应多条信息,导致出错

1
2
3
4
5
6
7
8
9
10
11
12
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) // 第二次返回
})
})

解决问题

把多条信息响应修改一下,使服务端给客户端只响应一条信息即可。

1
2
3
4
5
6
7
8
9
10
11
12
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’

报错内容

1
"ER_DATA_TOO_LONG: Data too long for column 'password' at row 1"

原因

数据库中password 写入的长度为300,但是password字段的长度只有200,因此报错

image-20220810220729082

解决问题

将数据库中password字段的长度增大即可。

“Error: ‘expiresIn’ should be a number of seconds or string representing a timespan”

报错内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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'就没问题了。猜测应该是将变量引入之后不是字符串了,解析成其他格式,导致引发错误。

原代码:

config.js
1
2
3
4
5
6
7
// 这是全局的配置文件
module.exports = {
// 加密和解密token的密钥
jwtSecretKey : 'lilbai518',
// token的有效期10小时
expriresIn: '10h'
}
user.js
1
const tokenStr = jwt.sign(user,config.jwtSecretKey,{expiresIn: config.expriresIn})

修改后代码:

1
const tokenStr = jwt.sign(user,config.jwtSecretKey,{expiresIn: '10h'})

request entity too large

报错内容

1
request entity too large

原因分析

image-20220812000324928

我在请求中加入了图片请求,可能是图片占用太大,导致请求失败

解决办法

降低请求体大小即可,将图片压缩后后再请求。

“NodeJs报错 throw new typeerror(‘app.use() requires a middleware function’)”

错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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’’’

报错内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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模块

  1. 看看导入模块有没有出错
  2. 看看package.json有没有下载包记录

发现package.json没有记录express,说明是是没有下载,那重新下载一下包就好了,npm i express

1
Error: Cannot find module 'express'

Syntax Error: TypeError: Cannot read properties of undefined (reading ‘parseComponent’)

报错内容

1
Syntax Error: TypeError: Cannot read properties of undefined (reading 'parseComponent')

错误分析

无法读取未定义的属性(“parseComponent”),可能我的vue版本和vue-template-compiler不一致导致,那么,先卸载vue-template-compiler,再安装vue-template-compilervue版本一致即可。

解决办法

查看vue版本

1
npm list vue

得到ue版本信息x.x.x

安装vue-template-compiler

vue的版本号填入以下的x.x.x

1
npm install vue-template-compiler@x.x.x

“解决Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client”

错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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...

解决前

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 定义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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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移到根目录即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
1
const userRouter = require('./router/router_head/user')

npm ERR! command failed

1
2
3
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/