node.js 最常用技术总结
1、跨域问题
如果发出ajax请求的页面比如(index.html)和提供http server的文件比如(http.js)不在同一个域名或者端口或者http协议不同,都会产生跨域的问题,根本原因就是浏览器同源策略。
解决方案,CORS,第一种情况,简单请求比如没有参数提交,没有自定义请求头文件。这样可以,添加代码
res.setHeader("Access-Control-Allow-Origin", "http://localhost:3001");
res.setHeader("Access-Control-Allow-Credentials", "true");
res.end(JSON.stringify([{ name: "tom", age: 20 }]));
加入http://localhost:3001这个请求地址,成为一个白名单成员,允许它请求数据。
第二种情况:修改了请求头,就不是简单请求,这时候可以这样设置。
else if (method == "OPTIONS" && url == "/users") {
res.writeHead(200, {
"Access-Control-Allow-Origin": "http://localhost:3001",
"Access-Control-Allow-Headers": "X-Token,Content-Type",
"Access-Control-Allow-Methods": "GET,POST,PUT",
"Access-Control-Allow-Credentials": "true"
});
res.end();
}
2、mongodb在命令行下使用起来不方便,一般我们要做成nodejs下的原生驱动。像写nodejs一样来操作const MongoClient = require("mongodb").MongoClient;
3、用mongodb先要在cmd中,mongod --dbpath D:date 开机,data文件夹自己手动创建在D盘根目录
4、req.body是post 方式提交请求时传入的参数,可以通过const bodyParser = require('body-parser');
app.use(bodyParser.json());
如果用koa开发的话,引入const bodyparser = require('koa-bodyparser');
app.use(bodyparser())
5、req.query是ajax请求时提交的查询参,如下req.query=={ page : 3 }
app.get('/api/list/:id',(req,res)=>{})
axios .get('/api/list/8?page=3')
6、req.params是ajax请求时提交的虚拟参,如下req.params=={ id: 8 }
app.get('/api/list/:id',(req,res)=>{})
axios .get('/api/list/8?page=3')
7、req.url是ajax请求时提交的url地址,如下req.url== '/api/list/6?page=1'
axios .get('/api/list/6?page=1')
7、req.path是ajax请求时提交的url地址中去掉查询参的部分,如下req.path== '/api/list/6'
axios .get('/api/list/6?page=1')
8、需要安装的模块
npm install nodemon -g
npm install express --save
npm install koa --save
npm install mongodb --save
npm install mongoose --save
npm install body-parser --save
npm install koa-bodyparser --save
npm install koa-router --save
npm install koa-static --save
npm install jsonwebtoken --save
npm install sha1 --save
npm install cookie-parser --save
9、设置静态文件目录
app.use(express.static('public')) // express
const static = require('koa-static')
app.use(static(path.join(__dirname+ '/public'))) // koa
10、在node文件中拼地址
const path = require('path')
path.resolve(__dirname+'/public') // 相当于根目录下的/public
11、mongoose写分页
model.find({}).skip().limit()
model是模型(集合的映射),skip的参数是从第几条开始查询,limit的参数是一页几条。
例如:
pageSize:10
url : /list?page=3
User.countDocuments({}, (error, count) => {
if (error) {
res.json({
status: 400,
msg: JSON.stringify(error)
});
} else {
User.find({}).skip((req.query.page - 1) * pageSize).limit(pageSize).sort({ 'created': -1 }).exec((err, doc) => {
if (err) {
res.json({
status: 400,
msg: JSON.stringify(err)
});
} else {
res.json({
status: 200,
result: doc, // doc就是从第20条到29条的一个数组
total: count,
msg:'OK'
});
}
})
}
12、for...in循环是 遍历对象的每一个可枚举属性,包括原型链上面的可枚举属性,而Object.keys()只是遍历自身的可枚举属性,不可以遍历原型链上的可枚举属性. 这是for...in和Object.keys()的主要区别,而Object.getOwnPropertyNames()则是遍历自身所有属性(不论是否是可枚举的),不包括原型链上面的.