nodejs菜鸟教程(nodejs怎么下载安装)

本文目录
- nodejs怎么下载安装
- 使用NodeJS如何实现WebSocket功能
- Nodejs如何搭建Web服务器
- 如何使用Nodejs连接mongodb数据库教程详解
- 在nodejs中如何实现微信支付
- 在nodejs中如何实现爬取网站图片
- 使用nodejs如何实现聊天功能
- 怎样用nodejs搭建服务器
- 菜鸟教程中的nodejs连接mysql数据库教程存在sql注入问题吗
nodejs怎么下载安装
很多新手不知道怎么安装nodejs,今天就给大家带来nodejs的下载安装教程,大家来看一下
一、安装nodejs
官网下载node.js 安装
系统变量下新建”NODE_PATH”,输入”D:\Program Files\nodejs\node_modules”
在nodejs 安装目录下新建目录 node_global node_cache
(用户变量”PATH”修改为“D:\Program Files\nodejs\node_global\”)
npm config set prefix “D:\Program Files\nodejs\node_global”
npm config set cache “D:\Program Files\nodejs\node_cache”
二、安装 cnpm
***隐藏网址***
三、遇到的问题
nodejs的npm命令无反应的解决方案
删除npmrc文件 C:\Users{账户}\下的.npmrc
npm ERR! Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE
npm config set strict-ssl false
相信看了这些案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
相关阅读:
前端的js框架总结以及用途讲解
javascript开发教程的三大结构详细介绍
服务端主动发送数据回客户端在H5里的实现步奏
使用NodeJS如何实现WebSocket功能
这篇文章主要介绍了NodeJS简单实现WebSocket功能,结合具体实例形式分析了nodejs实现WebSocket通信功能的客户端与服务器端相关操作技巧,需要的朋友可以参考下
本文实例讲述了NodeJS简单实现WebSocket功能。分享给大家供大家参考,具体如下:
我们基于express和socket.io开发,首先我们需要安装以下包
npm install --save express
npm install --save socket.io服务器端代码:
var app = require(’express’)();
***隐藏网址***
***隐藏网址***
app.get(’/’, function(req, res){
res.send(’《h1》Welcome Realtime Server《/h1》’);
});
io.on(’connection’, function(socket){
console.log(’a user connected’);
socket.on("disconnect", function() {
console.log("a user go out");
});
socket.on("message", function(obj) {
io.emit("message", obj);
});
});
***隐藏网址***
console.log(’listening on *:3000’);
});客户端代码
《!DOCTYPE html》
《html lang="en"》
《head》
《meta charset="UTF-8"》
《title》Document《/title》
***隐藏网址***
《/head》
《body》
《ul id="message"》《/ul》
《script》
socket = io.connect(’ws://127.0.0.1:3000’);
socket.emit("message", {"name" : navigator.userAgent, "msg" : "hello world"});
socket.on("message", function(obj) {
console.log(obj);
});
《/script》
《/body》
《/html》上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
如何使用puppeteer破解极验的滑动验证码
在jquery中给动态生成的标签绑定事件(详细教程)
在JS中如何改变页面颜色(详细教程)
Nodejs如何搭建Web服务器
***隐藏网址***
作为一个Web服务器应具备以下几个功能:
1、能显示以.html/.htm结尾的Web页面
2、能直接打开以.js/.css/.json/.text结尾的文件内容
3、显示图片资源
4、自动下载以.apk/.docx/.zip结尾的文件
***隐藏网址***
***隐藏网址***
引入需要用到的几个模块:
***隐藏网址***
***隐藏网址***
//url解析模块
var url = require(’url’);
//文件系统模块
var fs = require("fs");
//路径解析模块
var path = require("path");创建服务并在指定的端口监听:
//创建一个服务
***隐藏网址***
//在指定的端口监听服务
***隐藏网址***
***隐藏网址***
console.timeEnd("");
});在创建服务的时候需要传递一个匿名函数processRequest 对请求进行处理,processRequest接收2个参数,分别是request和response, request对象中包含了请求的所有内容,request是用来设置响应头以及对客户端做出响应操作。
processRequest:function(request,response){
var hasExt = true;
var requestUrl = request.url;
var pathName = url.parse(requestUrl).pathname;
//对请求的路径进行解码,防止中文乱码
pathName = decodeURI(pathName);
//如果路径中没有扩展名
if(path.extname(pathName) === ’’){
//如果不是以/结尾的,加/并作301重定向
if (pathName.charAt(pathName.length-1) != "/"){
pathName += "/";
***隐藏网址***
response.writeHead(301, {
location:redirect
});
response.end();
}
//添加默认的访问页面,但这个页面不一定存在,后面会处理
pathName += "index.html";
hasExt = false; //标记默认页面是程序自动添加的
}
//获取资源文件的相对路径
***隐藏网址***
//获取对应文件的文档类型
var contentType = this.getContentType(filePath);
//如果文件名存在
fs.exists(filePath,function(exists){
if(exists){
response.writeHead(200, {"content-type":contentType});
var stream = fs.createReadStream(filePath,{flags:"r",encoding:null});
stream.on("error", function() {
response.writeHead(500,{"content-type": "text/html"});
response.end("《h1》500 Server Error《/h1》");
});
//返回文件内容
stream.pipe(response);
}else { //文件名不存在的情况
if(hasExt){
//如果这个文件不是程序自动添加的,直接返回404
response.writeHead(404, {"content-type": "text/html"});
response.end("《h1》404 Not Found《/h1》");
}else {
//如果文件是程序自动添加的且不存在,则表示用户希望访问的是该目录下的文件列表
var html = "《head》《meta charset=’utf-8’》《/head》";
try{
//用户访问目录
var filedir = filePath.substring(0,filePath.lastIndexOf(’\\’));
//获取用户访问路径下的文件列表
var files = fs.readdirSync(filedir);
//将访问路径下的所以文件一一列举出来,并添加超链接,以便用户进一步访问
for(var i in files){
var filename = files;
html += "《div》《a href=’"+filename+"’》"+filename+"《/a》《/div》";
}
}catch (e){
html += "《h1》您访问的目录不存在《/h1》"
}
response.writeHead(200, {"content-type": "text/html"});
response.end(html);
}
}
});
},请求处理函数中有几个重点需要说一下:
对于路径中有中文的,浏览器会自动进行编码(英文不变,中文会变),因此在接收到地址后,需要对地址进行解码,否则最后得到的路径和真实路径不相符,
当访问路径不是以具体的文件结尾,并且不是以/结尾,则需要通过重定向加上/,表示当前目录,否则当前路径下的静态资源会找不到
如果访问路径是目录,则列出该目录下所有文件及文件夹,并可以点击访问,为了让中文目录能正常显示,则还要在header中设置charset=utf-8
***隐藏网址***
如果要运行demo,打开cmd切换到根目录,运行node start即可。
如何使用Nodejs连接mongodb数据库教程详解
这篇文章主要介绍了使用Nodejs连接mongodb数据库的实现代码,需要的朋友可以参考下
一个简单的nodejs连接mongodb示例,来自 mongodb官方示例
1. 创建package.json
首先,创建我们的工程目录connect-mongodb,并作为我们的当前目录
输入npm init命令创建package.json
然后,安装mongodb的nodejs版本driver
mongodb驱动包将会安装到当前目录下的node_modules中
2. 启动MongoDB服务器
安装MongoDB并启动MongoDB数据库服务,可参考我之前的文章,或者MongoDB官方文档
3. 连接MongoDB
创建一个app.js文件,并添加以下代码来连接服务器地址为192.168.0.243,mongodb端口为27017上名称为myNewDatabase的数据库
在命令行输入以下命令运行app.js
4. 插入文档
在app.js中添加以下代码,使用insertMany方法添加3个文档到documents集合中
insert命令返回一个包含以下属性的对象:
result MongoDB返回的文档结果
ops 添加了_id字段的文档
connection 执行插入操作所使用的connection
在app.js更新以下代码调用insertDocuments方法
在命令行中使用node app.js运行
5. 查询所有文档
添加findDocuments函数
findDocuments函数查询了所有’documents’集合中所有的文档,将此函数添加到MongoClient.connect的回调函数中
6. 使用过滤条件(query filter)查询文档
查询’a’:3的文档
7. 更新文档
updateDocument方法更新满足条件a为2的第一个文档,新增一个b属性,并将其设置为1。
将updateDocument方法添加到MongoClient.connect方法的回调中
8. 删除文档
添加到app.js中
9. 创建索引
索引能够改善应用的性能。下面你代码在’a’属性上添加索引
更新app.js
在nodejs中如何实现微信支付
这篇文章主要为大家详细介绍了基于nodejs实现微信支付功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了nodejs实现微信支付的具体代码,供大家参考,具体内容如下
通过nodejs使用微信支付最重要的就是微信的签名,在这里md5后的字符必须转化为大写
一、回复微信通知消息模版
message.ejs
《xml》
《return_code》《!》《/return_code》
《return_msg》《!》《/return_msg》
《/xml》二、微信支付model文件代码
wxpay.js
var config = require(’../config’); //配置文件 appid 等信息
var Q = require("q");
var request = require("request");
var crypto = require(’crypto’);
var ejs = require(’ejs’);
var fs = require(’fs’);
var key = "此处为申请微信支付的API密码";
var messageTpl = fs.readFileSync(__dirname + ’/message.ejs’, ’utf-8’);
var WxPay = {
getXMLNodeValue: function(node_name, xml) {
var tmp = xml.split("《" + node_name + "》");
var _tmp = tmp.split("《/" + node_name + "》");
return _tmp;
},
raw: function(args) {
var keys = Object.keys(args);
keys = keys.sort()
var newArgs = {};
keys.forEach(function(key) {
newArgs;
});
var string = ’’;
for (var k in newArgs) {
string += ’&’ + k + ’=’ + newArgs;
}
string = string.substr(1);
return string;
},
paysignjs: function(appid, nonceStr, package, signType, timeStamp) {
var ret = {
appId: appid,
nonceStr: nonceStr,
package: package,
signType: signType,
timeStamp: timeStamp
};
var string = this.raw(ret);
string = string + ’&key=’ + key;
var sign = crypto.createHash(’md5’).update(string, ’utf8’).digest(’hex’);
return sign.toUpperCase();
},
paysignjsapi: function(appid, attach, body, mch_id, nonce_str, notify_url, openid, out_trade_no, spbill_create_ip, total_fee, trade_type) {
var ret = {
appid: appid,
attach: attach,
body: body,
mch_id: mch_id,
nonce_str: nonce_str,
notify_url: notify_url,
openid: openid,
out_trade_no: out_trade_no,
spbill_create_ip: spbill_create_ip,
total_fee: total_fee,
trade_type: trade_type
};
var string = this.raw(ret);
string = string + ’&key=’ + key; //key为在微信商户平台(pay.weixin.qq.com)--》账户设置--》API安全--》密钥设置
var crypto = require(’crypto’);
var sign = crypto.createHash(’md5’).update(string, ’utf8’).digest(’hex’);
return sign.toUpperCase();
},
// 随机字符串产生函数
createNonceStr: function() {
return Math.random().toString(36).substr(2, 15);
},
// 时间戳产生函数
createTimeStamp: function() {
return parseInt(new Date().getTime() / 1000) + ’’;
},// 此处的attach不能为空值 否则微信提示签名错误
order: function(attach, body, mch_id, openid, bookingNo, total_fee, notify_url) {
var deferred = Q.defer();
var appid = config.member_config.appid;
var nonce_str = this.createNonceStr();
var timeStamp = this.createTimeStamp();
***隐藏网址***
var formData = "《xml》";
formData += "《appid》" + appid + "《/appid》"; //appid
formData += "《attach》" + attach + "《/attach》"; //附加数据
formData += "《body》" + body + "《/body》";
formData += "《mch_id》" + mch_id + "《/mch_id》"; //商户号
formData += "《nonce_str》" + nonce_str + "《/nonce_str》"; //随机字符串,不长于32位。
formData += "《notify_url》" + notify_url + "《/notify_url》";
formData += "《openid》" + openid + "《/openid》";
formData += "《out_trade_no》" + bookingNo + "《/out_trade_no》";
formData += "《spbill_create_ip》61.50.221.43《/spbill_create_ip》";
formData += "《total_fee》" + total_fee + "《/total_fee》";
formData += "《trade_type》JSAPI《/trade_type》";
formData += "《sign》" + this.paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, bookingNo, ’61.50.221.43’, total_fee, ’JSAPI’) + "《/sign》";
formData += "《/xml》";
var self = this;
request({
url: url,
method: ’POST’,
body: formData
}, function(err, response, body) {
if (!err && response.statusCode == 200) {
console.log(body);
var prepay_id = self.getXMLNodeValue(’prepay_id’, body.toString("utf-8"));
var tmp = prepay_id.split(’[’);
var tmp1 = tmp’);
//签名
var _paySignjs = self.paysignjs(appid, nonce_str, ’prepay_id=’ + tmp1, ’MD5’, timeStamp);
var args = {
appId: appid,
timeStamp: timeStamp,
nonceStr: nonce_str,
signType: "MD5",
package: tmp1,
paySign: _paySignjs
};
deferred.resolve(args);
} else {
console.log(body);
}
});
return deferred.promise;
},
//支付回调通知
notify: function(obj) {
var output = "";
if (obj.return_code == "SUCCESS") {
var reply = {
return_code: "SUCCESS",
return_msg: "OK"
};
} else {
var reply = {
return_code: "FAIL",
return_msg: "FAIL"
};
}
output = ejs.render(messageTpl, reply);
return output;
},
};
module.exports = WxPay;三、在express router中调用wxpay
//微信支付demo
router.get(’/order’, function(req, res, next){
var attach = "1276687601";
var body = "测试支付";
var mch_id = "1111111"; //商户ID
var openid = "111111";
var bookingNo = "201501806125346"; //订单号
var total_fee = 10;
***隐藏网址***
wxpay.order(attach, body, mch_id, openid, bookingNo, total_fee, notify_url).then(function(data){
res.render(’wxpay’, {args: data});
});
});//微信回调通知 采用数据流形式读取微信返回的xml数据 此处不在累赘
router.post(’/notify’, function(req, res, next){
});上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
有关vue中如何实现二级联动默认选中第一个值
使用js实现推箱子小游戏(详细教程)
使用JavaScript如何实现快速排序(详细教程)
使用casperjs和resemble.js如何实现像素对比(详细教程)
在nodejs中如何实现爬取网站图片
给大家通过一个实例来教学如何用nodejs实现爬取网站图片功能,有兴趣的朋友收藏一下吧。
通过实例给大家讲解nodejs实现爬取网站图片功能,以下就是全部内容:
原理:
爬虫是最明显的IO密集型应用场景,显然用node,使得I/O等待开销小数据挖掘比较方便
借助express模块来搭建node服务
并使用request模块获取目标页面的html代码
下载cheerio模块对html代码做处理(cheerio类似jQuery的语法,所以好用又方便)
环境配置:
npm install express request cheerio --save(1)引入各个模块
***隐藏网址***
var request = require(’request);
var cheerio = require(’cheerio’);
var fs = require(’fs’); //用来操作文件
***隐藏网址***
***隐藏网址***
var html = ’’;
var titles = ;
res.setEncoding(’utf-8’) //防止中文乱码
res.on(’data’,function(chunk){
html += chrunk; //监听data事件 每次取一块数据
})
res.on(’end’,function(){
var $ = cheerio.load(html); //获取数据完成后,解析html
//将获取的图片存到images文件夹中
$(’.mod-bd img’).each(function(index, item){
//获取图片属性
var imgName = $(this).parent().next().text().trimg()
var imgfile = imgName + ’.jpeg’;
var imgSrc = $(this).attr(’src’)
//采用request模块,向服务器发起请求 获取图片资源
request.head(imgSrc, function(error, res,body){
if(error){
console.log(’失败了’)
}
});
//通过管道的方式用fs模块将图片写到本地的images文件下
request(imgSrc).pipe.(fs.createWriteStream(’./images/’ + imgfile));
})
})
})上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
使用js如何实现从新赋值
在js中如何将canvas生成图片保存
在js中如何实现双向绑定
详细介绍webpack比较实用功能
使用jQuery如何实现菜单添加移除功能
使用nodejs+mongodb+vue如何配置ueditor
使用nodejs如何实现聊天功能
这篇文章主要介绍了nodejs简单实现TCP服务器端和客户端的聊天功能,结合实例形式分析了nodejs基于TCP协议实现的聊天程序客户端与服务器端具体步骤与相关操作技巧,代码备有较为详尽的注释便于理解,需要的朋友可以参考下
本文实例讲述了nodejs简单实现TCP服务器端和客户端的聊天功能。分享给大家供大家参考,具体如下:
服务器端
var net = require(’net’);
var server = net.createServer();
//聚合所有客户端
var sockets = ;
//接受新的客户端连接
server.on(’connection’, function(socket){
console.log(’got a new connection’);
sockets.push(socket);
//从连接中读取数据
socket.on(’data’, function(data){
console.log(’got data:’, data);
//广播数据
//每当一个已连接的用户输入数据,就将这些数据广播给其他所有已连接的用户
sockets.forEach(function(otherSocket){
if (otherSocket !== socket){
otherSocket.write(data);
}
});
//删除被关闭的连接
socket.on(’close’, function(){
console.log(’connection closed’);
var index = sockets.indexOf(socket);
sockets.splice(index, 1);
});
});
});
server.on(’error’, function(err){
console.log(’Server error:’, err.message);
});
server.on(’close’, function(){
console.log(’Server closed’);
});
server.listen(4000);客户端
var net = require(’net’);
var port = 4000;
var quitting = false;
var conn;
var retryTimeout = 3000; //三秒,定义三秒后重新连接
var retriedTimes = 0; //记录重新连接的次数
var maxRetries = 10; //最多重新连接十次
process.stdin.resume(); //process.stdin流来接受用户的键盘输入,这个可读流初始化时处于暂停状态,调用流上的resume()方法来恢复流
process.stdin.on(’data’, function(data){
if (data.toString().trim().toLowerCase() === ’quit’){
quitting = true;
console.log(’quitting’);
conn.end();
process.stdin.pause();
} else {
conn.write(data);
}
});
//连接时设置最多连接十次,并且开启定时器三秒后再连接
(function connect() {
function reconnect() {
if (retriedTimes 》= maxRetries) {
throw new Error(’Max retries have been exceeded, I give up.’);
}
retriedTimes +=1;
setTimeout(connect, retryTimeout);
}
conn = net.createConnection(port);
conn.on(’connect’, function() {
retriedTimes = 0;
console.log(’connect to server’);
});
conn.on(’error’, function(err) {
console.log(’Error in connection:’, err);
});
conn.on(’close’, function() {
if(! quitting) {
console.log(’connection got closed, will try to reconnect’);
reconnect();
}
});
//打印
conn.pipe(process.stdout, {end: false});
})();上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
详解如何实现vuex(详细教程)
通过vue.js实现微信支付
在Vue2.0中实现用户权限控制
Vue组件和Route的生命周期(详细教程)
利用SpringMVC解决vue跨域请求
怎样用nodejs搭建服务器
这次给大家带来怎样用nodejs搭建服务器,用nodejs搭建服务器的注意事项有哪些,下面就是实战案例,一起来看一下。
Gxl网相关教程推荐:Node.js视频教程
简单开始
***隐藏网址***
2.安装ws模块
***隐藏网址***
3.server.js
在项目里面新建一个server.js,创建服务,指定8181端口,将收到的消息log出来。
var WebSocketServer = require(’ws’).Server,
wss = new WebSocketServer({ port: 8181 });
wss.on(’connection’, function (ws) {
console.log(’client connected’);
ws.on(’message’, function (message) {
console.log(message);
});
});4.建立一个client.html。
在页面上建立一个WebSocket的连接。用send方法发送消息。
var ws = new WebSocket("ws://localhost:8181");
ws.onopen = function (e) {
console.log(’Connection to server opened’);
} function sendMessage() {
ws.send($(’#message’).val());
}页面:
***隐藏网址***
***隐藏网址***
《title》WebSocket Echo Demo《/title》
《meta name="viewport" content="width=device-width, initial-scale=1"/》
《link href="../bootstrap-3.3.5/css/bootstrap.min.css" rel="stylesheet" /》
《script src="../js/jquery-1.12.3.min.js"》《/script》
《script src="../js/jquery-1.12.3.min.js"》《/script》
《script src="../bootstrap-3.3.5/js/bootstrap.min.js"》《/script》
《script》
var ws = new WebSocket("ws://localhost:8181");
ws.onopen = function (e) {
console.log(’Connection to server opened’);
} function sendMessage() {
ws.send($(’#message’).val());
} 《/script》《/head》《body 》
《p class="vertical-center"》
《p class="container"》
《p》《/p》
《form role="form" id="chat_form" onsubmit="sendMessage(); return false;"》
《p class="form-group"》
《input class="form-control" type="text" name="message" id="message"
placeholder="Type text to echo in here" value="" /》
《/p》
《button type="button" id="send" class="btn btn-primary"
onclick="sendMessage();"》
Send! 《/button》
《/form》
《/p》
《/p》《/body》《/html》View Code
运行之后如下,服务端即时获得客户端的消息。
模拟股票
上面的例子很简单,只是为了演示如何运用nodejs的ws创建一个WebSocket服务器。且可以接受客户端的消息。那么下面这个例子演示股票的实时更新。客服端只需要连接一次,服务器端会不断地发送新数据,客户端收数据后更新UI.页面如下,有五只股票,开始和停止按钮测试连接和关闭。
服务端:
1.模拟五只股票的涨跌。
var stocks = { "AAPL": 95.0, "MSFT": 50.0, "AMZN": 300.0, "GOOG": 550.0, "YHOO": 35.0}function randomInterval(min, max) { return Math.floor(Math.random() * (max - min + 1) + min);
}var stockUpdater;var randomStockUpdater = function() { for (var symbol in stocks) { if(stocks.hasOwnProperty(symbol)) { var randomizedChange = randomInterval(-150, 150); var floatChange = randomizedChange / 100;
stocks += floatChange;
}
} var randomMSTime = randomInterval(500, 2500);
stockUpdater = setTimeout(function() {
randomStockUpdater();
}, randomMSTime);
}
randomStockUpdater();2.连接建立之后就开始更新数据
wss.on(’connection’, function (ws) { var sendStockUpdates = function (ws) { if (ws.readyState == 1) { var stocksObj = {}; for (var i = 0; i 《 clientStocks.length; i++) { var symbol = clientStocks;
stocksObj;
} if (stocksObj.length !== 0) { ws.send(JSON.stringify(stocksObj));//需要将对象转成字符串。WebSocket只支持文本和二进制数据
console.log("更新", JSON.stringify(stocksObj));
}
}
} var clientStockUpdater = setInterval(function () {
sendStockUpdates(ws);
}, 1000);
ws.on(’message’, function (message) { var stockRequest = JSON.parse(message);//根据请求过来的数据来更新。
console.log("收到消息", stockRequest);
clientStocks = stockRequest;
sendStockUpdates(ws);
});客户端:
建立连接:
var ws = new WebSocket("ws://localhost:8181");onopen直接只有在连接成功后才会触发,在这个时候将客户端需要请求的股票发送给服务端。
var isClose = false; var stocks = { "AAPL": 0, "MSFT": 0, "AMZN": 0, "GOOG": 0, "YHOO": 0
}; function updataUI() {
ws.onopen = function (e) {
console.log(’Connection to server opened’);
isClose = false; ws.send(JSON.stringify(stock_request));
console.log("sened a mesg");
} //更新UI
var changeStockEntry = function (symbol, originalValue, newValue) { var valElem = $(’#’ + symbol + ’ span’);
valElem.html(newValue.toFixed(2)); if (newValue 《 originalValue) {
valElem.addClass(’label-danger’);
valElem.removeClass(’label-success’);
} else if (newValue 》 originalValue) {
valElem.addClass(’label-success’);
valElem.removeClass(’label-danger’);
}
} // 处理受到的消息
ws.onmessage = function (e) { var stocksData = JSON.parse(e.data);
console.log(stocksData); for (var symbol in stocksData) { if (stocksData.hasOwnProperty(symbol)) {
changeStockEntry(symbol, stocks);
stocks;
}
}
};
}
updataUI();运行效果如下:只需要请求一次,数据就会不断的更新,效果是不是很赞,不用轮询,也不用长连接那么麻烦了。文章末尾会附上所有源码。
(美股的涨跌和A股的颜色是反的,即红跌绿涨)
实时聊天
上面的例子是连接建立之后,服务端不断给客户端发送数据。接下来例子是一个简单的聊天室类的例子。可以建立多个连接。
1.安装node-uuid模块,用来给每个连接一个唯一号。
2.服务端消息发送
消息类型分notification和message两种,前者是提示信息,后者是聊天内容。消息还包含一个id、昵称和消息内容。在上一节有学习到readyState有四个值,OPEN表示连接建立可以发送消息。如果页面关闭了,为WebSocket.CLOSE。
function wsSend(type, client_uuid, nickname, message) { for (var i = 0; i 《 clients.length; i++) { var clientSocket = clients.ws; if (clientSocket.readyState === WebSocket.OPEN) {
clientSocket.send(JSON.stringify({ "type": type, "id": client_uuid, "nickname": nickname, "message": message
}));
}
}
}3.服务端处理连接
每新增加一个连接,都会发送一条匿名用户的加入的提示消息,如果消息中带有“/nick” 认为这一个修改昵称的消息。然后更新客户端的昵称。其他都会当做聊天消息处理。
wss.on(’connection’, function(ws) { var client_uuid = uuid.v4(); var nickname = "AnonymousUser" + clientIndex;
clientIndex += 1;
clients.push({ "id": client_uuid, "ws": ws, "nickname": nickname });
console.log(’client connected’, client_uuid); var connect_message = nickname + " has connected"; wsSend("notification", client_uuid, nickname, connect_message);
console.log(’client connected’, client_uuid);
ws.on(’message’, function(message) { if (message.indexOf(’/nick’) === 0) { var nickname_array = message.split(’ ’); if (nickname_array.length 》= 2) { var old_nickname = nickname;
nickname = nickname_array; var nickname_message = "Client " + old_nickname + " changed to " + nickname; wsSend("nick_update", client_uuid, nickname, nickname_message);
}
} else {
wsSend("message", client_uuid, nickname, message);
}
});处理连接关闭:
var closeSocket = function(customMessage) { for (var i = 0; i 《 clients.length; i++) { if (clients.id == client_uuid) { var disconnect_message; if (customMessage) {
disconnect_message = customMessage;
} else {
disconnect_message = nickname + " has disconnected";
} wsSend("notification", client_uuid, nickname, disconnect_message);
clients.splice(i, 1);
}
}
};
ws.on(’close’, function () {
closeSocket();
});4.客户端
没有启动时,页面如下,change按钮用来修改昵称。
《p class="vertical-center"》
《p class="container"》
《ul id="messages" class="list-unstyled"》《/ul》
《hr/》
《form role="form" id="chat_form" onsubmit="sendMessage(); return false;"》
《p class="form-group"》
《input class="form-control" type="text" id="message" name="message"
placeholder="Type text to echo in here" value="" autofocus/》
《/p》
《button type="button" id="send" class="btn btn-primary"
onclick="sendMessage();"》
Send Message 《/button》
《/form》
《p class="form-group"》《span》nikename:《/span》《input id="name" type="text" /》 《button class="btn btn-sm btn-info" onclick="changName();"》change《/button》《/p》
《/p》
《/p》View Code
js:
ws = WebSocket("ws://localhost:8181" nickname = ""= ’Connection to server opened’
( message == "undefined") messages = document.getElementById(’messages’ messageElem = document.createElement("li" (type === ’notification’= "《span class=\"label label-info\"》*《/span》" (type == ’nick_update’= "《span class=\"label label-warning\"》*《/span》"= "《span class=\"label label-success\"》"
+ nickname + "《/span》" message_text = "《h3》" + preface_label + ""
+ message + "《/h3》"=
ws.onmessage = data =="ID: = %s"= "Connection closed""Connection closed"
messageField = document.getElementById(’message’ (ws.readyState ==== ’’
name = $("#name" (ws.readyState ==="/nick " + 运行结果:
页面
菜鸟教程中的nodejs连接mysql数据库教程存在sql注入问题吗
是否有漏洞与代码有关,与此无关
其中主流的连接MySQL的方式是用mysql或者mysql2包,它们只是提供了调用驱动的api。很多框架中包括egg,nest都是基于此封装的。
但这不是SQL注入的关键,它只是一种连接方式。它只管连接,不管其他的,存不存在SQL注入完全靠写代码的人本身啊。
一句脚本本没有问题(知道不让直接放sql的,也是放注入),但是你如果让SQL变成由用户输入拼接而成,那就存在SQL注入的风险。
你应该去了解SQL注入的原理,然后进行防患,百度就能找到,然后可以用ORM,一般都对输入做了处理,还能避免直接写SQL(但其实难的地方还得自己写)。
有不理解可以追问。

更多文章:
win7更新和安全在哪里(win7 64位 windows update更新存储文件位置在哪里 啊)
2026年9月7日 18:50
阿里旺旺苹果手机版(苹果iPhone 4手机能用阿里旺旺吗)
2026年9月7日 17:50
启动盘制作完成后怎么放入系统(u盘启动盘制作好了要怎么做才能装系统)
2026年9月7日 13:30
cpu天梯图2022年11月(2022手机cpu性能排行榜天梯图)
2026年9月7日 10:10







