node常见面试题库
1、检测系统中node版本号的指令是?
node -v
2、如何退出node执行环境(REPL环境)?
ctrl+c c
3、node如何创建服务器,写出代码?
var http=require(‘http’);
var server=http.createServer(function(req,res,next){
//业务逻辑 })
server.listen(3000,function(err){if(!err){console.log(‘服务器运行在3000端口上’)}})
4、http.createServer(function(req,res){ // 获取请求 })在如上函数中如何获取前端请求地址?
req.url
5、req,res分别代表什么?
req:全称request请求对象
res:全称 response响应对象
6.如何向客户端浏览器响应‘hello world’?
res.write(‘hello world’);
res.end()
7.浏览器请求 ‘/favicon.ico’表示什么?如何做出响应?
表示浏览器(客户端)请求页面图标
if(req.url==’/favicon.ico’){
fs.readFile(‘图标地址’,function(err,data){
res.write(data);
res.end()
})
}
8、如何加载fs模块?
var fs=require(“fs”);
9、fs模块如何异步读取一个文件(文件路径为:’./file.json’)?
fs.readFile(‘./file.json’,’utf-8’,function(err,data){
If(!err){
// data即为读取内容
}
})
10、fs如何同步读取文件(文件的路径为:‘./file.json’)?
fs.readFileSync(‘’./file.json”,”utf-8”);
11、同步和异步的区别?各举一个Js中同步和异步的案例?
异步:在一件事情没有做完,可以接着做另外一件事 非阻塞
同步:一件事情没有做完,就不可以做下一件事 阻塞。
同步案例:for循环语句,alert() 等
异步案例:定时器,ajax异步请求
12、fs如何异步写入文件,写入内容为‘abc’,写入文件路径为’./file.txt’?
fs.writeFile(‘./file.txt’,’abc’,function(err){ })
13、写出注册的form表单,提交地址为’/api/login’,提交方式为’get’,用户名字段为user,密码字段为pass?
<form action=”/api/login” method=’get’>
用户名:<input type=’text’ name=”user”/>
密码:<input type=’password’ user=”pass”>
<button type=’submit’ >注册</button>
</form>
14、querystring模块如何解析如下字符串,(‘user=tom&pass=123456’)?
querystring.parse(‘user=tom?pass=123456’)
15、url模块如何解析请求地址req.url, 得到如下参数{pathanem:’/’,query:{user:xxx,pass:xxxx}} ?
url.parse(req.url,true)
16、node服务器如何设置跨域请求和中文乱码?
res.writeHead(200, {
'Content-Type': 'application/json;charset=utf-8',
'Access-Control-Allow-Origin': '*'
})
17、npm是什么?
npm是包管理工具
18、npm如何下载 jquery?
npm install jquery@版本号 或者 npm install jquery
19、npm工具下载的包放在哪个文件夹里?
node_modules
20、npm如何创建package.json?
npm init
21、cnpm 和npm的区别?我们下载插件一般用哪个?
npm 下载资源服务器在国外,cnpm下载资源服务器为国内淘宝镜像 。 一般下载用cnpm
22 、commonjs规范,如何导出一个模块?
module.exports={}
23、commonjs规范,如何导入一个模块?
var module=require(‘模块名或路径’)
24、自己仿写url模块(能把’/api?user=tom&pass=12345’解析成对象{pathname:’/api’,query:{user:’tom’,pass:12345}}),遵循commenjs规范?
module.exports={
parse:function(str,foo){
var arr=str.split('?');
var pathname=arr[0]
if(foo){
var arr1=arr[1].split('&');
var query={};
for(var i=0;i<arr1.length;i++){
var arr2=arr1[i].split('=');
query[arr2[0]]=arr2[1];
}
}else{
var query=arr[1];
}
return {pathanme:pathname,query:query}
}
}
25、npm包的发布流程?
1.npm login 登录
username:用户名
password:密码
email:邮箱
2.npm publish 发布
26、node服务器如何接受post请求?
var str=””
req.on(‘data’,function(thunk){
str+=thunk;
})
req.on(‘end’,function(){
})
27.get与post区别?
历史 参数保留在浏览器历史中。 参数不会保存在浏览器历史中。
对数据长度的限制 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 无限制。
安全性 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。
在发送密码或其他敏感信息时绝不要使用 GET ! POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
可见性 数据在 URL 中对所有人都是可见的。 数据不会显示在 URL 中。
1. get是从服务器上获取数据,post是向服务器传送数据。
2. GET请求把参数包含在URL中,将请求信息放在URL后面,POST请求通过request body传递参数,将请求信息放置在报文体中。
3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
4. get安全性非常低,get设计成传输数据,一般都在地址栏里面可以看到,post安全性较高,post传递数据比较隐私,所以在地址栏看不到, 如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监听到。
5. GET请求能够被缓存,GET请求会保存在浏览器的浏览记录中,以GET请求的URL能够保存为浏览器书签,post请求不具有这些功能。
6. HTTP的底层是TCP/IP,GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
7.GET产生一个TCP数据包,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);POST产生两个TCP数据包,对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
28、express搭建服务器完成案例(注意:视图文件的配置,视图文件引擎的配置,静态资源文件的配置)(录屏)?
一.首先创建app.js文件如下:
//加载express模块
var express=require("express");
// 创建app服务器 等同于 http.createServer()
var app=express();
//加载路由模块
var IndexRouter=require('./routes/index.js');
var RouterHome=require('./routes/home.js')
//导入path模块(处理路径的模块)
var path=require("path");
//加载ejs模板
var ejs=require("ejs");
//配置 视图文件位置
app.set("views",path.join(__dirname,"views"));
//配置 视图文件引擎
app.set('view engine','ejs')
//设置静态资源文件位置
app.use('/public',express.static(path.join(__dirname,'public')))
//指定ip或域名 (本地ip:127.0.0.1等同于本地域名localhost)
var ip='127.0.0.1';
//指定端口
var port=3000;
//app服务器监听端口
app.listen(port,ip,function(){ //app服务器监听端口
console.log("服务器运行在http://"+ip+":"+port)
});
//配置 一级路由规则
app.use('/',IndexRouter)
app.use('/a',RouterA)
//404处理
function fn(req,res){ // app添加 get请求根路径的路由
// res.send("hello world");// 向前台输出
console.log(req.url)
res.write("404");
res.end()
}
二.安装依赖 express ,ejs
三.创建views(视图文件),public(静态资源文件),routes(路由文件)文件夹
四.routes下创建路由文件index.js,a.js
//加载express模块
var express = require('express');
//创建router对象
var router = express.Router();
//配置 二级路由
router.get('/', function(req, res, next) {
res.render('index')
});
//导出路由模块
module.exports = router;
29、ejs文件中如何声明变量a?
<% a=100 %>
30.ejs文件中如何使用输入变量a?
<%= a %>
31.ejs文件中如何引用 外部ejs文件(比如:./head.ejs)?
<% include ./head.ejs %>
32.如果ejs文件中有数据 list=[{name:’apple’,price:5,address:’烟台’},{name:”香蕉”,price:8,address:’海南’},… ],如何用表格将他们展示出来?
<% for(var a in list){ %> <% } %>
水果名 价格 产地
<%= list[a].name %> <%= list[a].price %> <%= list[a].address %>
33、要点:
1.path.parse() 解析地址
2.path.normalize()格式化路径 注意'..' 和 '.'
3.path.join() 连接路径
4.path.resolve() 转换为绝对路径
34._ _dirname表示什么?
当前文件所在目录
35._ _filename表示什么?
当前文件路径
- var str=‘c:\wamp\www\a.html’;
var obj=path.parse(str);
请写出obj.base,obj.ext,obj.dir,obj.name的值?
obj.base==‘a.html’
obj.ext==’.html’
obj.dir==’c:\\wamp\\www\\’
obj.name==’a’
37.console.log(path.normalize(’/test/test1//abc/tab/…’));输出结果?
‘/test/test1/abc/’
5.console.log(path.join(‘/test’, ‘test1’, ‘home/api’, ‘tab’, ‘…’));输出结果?
‘/test/test1/home/api/’
38、全局安装express-generater 指令是?
cnpm install express-generator -g
或者
npm install express-generator -g
39、express创建项目test指令?
express -e test
- express创建的项目中文件夹和文件有哪些?各自含义?
app.js 是主文件
package.json 是配置文件
bin启动文件
public静态资源文件
routes路由
views是视图文件
node_modules 项目依赖
41、命令行启动mongodb数据库服务器在27017端口上的指令是(数据库位置c:/data/db)?
mongod --dbpath c:/data/db --port 27017
42、命令行连接数据库数据库服务器的指令是(本地服务器,端口27017)?
mongo --port 27017
43 、命令行查看数据库的指令?
show dbs
44、命令行查看当前数据库集合的指令?
show collections
45、命令行向user集合添加文档{user:tom,pass:123456}的指令?
db.user.insert({user:’tom’,pass:123456});
46.命令行查询user集合中所有文档?
db.user.find()
47、命令行查询user集合中age大于18且小于20的文档?
db.user.find({age:{$gt:18,$lt:20}})
48、命令行更新 user集合中name为‘李四’的文档,sex改为女,其他字段不变?
db.user.update({name:’李四’},{$set:{sex:’女’}})
49、命令行删除user集合中 age大于20且性别sex不为女的所有文档
db.user.remove({$and:[{age:{$gt:20}},{sex:{$ne:’女’}}]})
或
db.user.remove({age:{$gt:20},sex:{$ne:’女’}})
50、请简述mongoose是什么及作用?
Mongoose是封装了MongoDB操作的一个对象模型库
作用是连接后台服务器与数据库服务器,操作数据库
(增删改查)