node 如何使用mysql

node 如何使用mysql,第1张

先安装mysql模块。

node.js默认安装时,模块文件放在 /usr/local/lib/node_modules 这个目录下,为了便宜管理,模块还是统一安装到这里好。

$ cd /usr/local/lib        

$ npm install mysql        

程序文件mysql.js

var Client = require('/usr/local/lib/node_modules/mysql').Client

var client = new Client()

client.user = 'root'

client.password = ''

console.log('Connecting to MySQL...')

client.query('USE tiny_shop')    //如果MySQL中没有库表,赶紧建。

http = require("http")

var server = http.createServer(function(request, response) {

   response.writeHeader(200, {"Content-Type": "text/html"})

   client.query('SELECT * FROM tags', function selectCb(err, results, fields) {  

       if (err) {  

           throw err 

       }  

       var data = ''

       for (var i=0i<results.lengthi++) {          

           var firstResult = results[i]

           data += 'id: ' + firstResult['id']+'tag: ' + firstResult['tag']

       }

       response.write(data)

       response.end()

   })

})

server.listen(8080)

var sys = require("util")

sys.puts("Server running at http://localhost:8080/")

运行

$ node mysql.js

利用 Express 中间件功能实现登录拦截。如果用户请求的路径需要登录后才能访问,将用户重定向到登录页面,登录成功后将用户重定向到原始请求路径。

设置应用中间件,监控所有请求

// app.js

app.use(function (req, res, next) {

  if (req.session.user) {  // 判断用户是否登录

    next()

  } else {

    // 解析用户请求的路径

    var arr = req.url.split('/')

    // 去除 GET 请求路径上携带的参数

    for (var i = 0, length = arr.length i < length i++) {

      arr[i] = arr[i].split('?')[0]

    }

    // 判断请求路径是否为根、登录、注册、登出,如果是不做拦截

    if (arr.length > 1 && arr[1] == '') {

      next()

    } else if (arr.length > 2 && arr[1] == 'user' && (arr[2] == 'register' || arr[2] == 'login' || arr[2] == 'logout')) {

      next()

    } else {  // 登录拦截

      req.session.originalUrl = req.originalUrl ? req.originalUrl : null  // 记录用户原始请求路径

      req.flash('error', '请先登录')

      res.redirect('/user/login')  // 将用户重定向到登录页面

    }

  }

})

如果拦截规则复杂,可以将不被拦截的路径写入白名单,然后通过判断路径是否在白名单中来处理是否拦截;如果拦截规则简单,像以上代码中使用if else判断也可以满足要求。

登录成功后将用户重定向到原始请求路径

// routes/user.js

router.post('/login', function (req, res, next) {

  // 判断用户名密码是否正确

  ......

  req.session.user = user  // 将用户信息写入 session

  if (req.session.originalUrl) {  // 如果存在原始请求路径,将用户重定向到原始请求路径

    var redirectUrl = req.session.originalUrl

    req.session.originalUrl = null  // 清空 session 中存储的原始请求路径

  } else {  // 不存在原始请求路径,将用户重定向到根路径

    var redirectUrl = '/'

  }

  res.redirect(redirectUrl)

})

安装

$ npm install mysql

有关之前的0.9.x版本的信息, 请访问 v0.9分支。

有时我还会要求你从Github安装最新版以检查bug是否已修复。在这种情况下,请输入:

$ npm install mysqljs/mysql

引言

这是node.js的mysql驱动。它是用JavaScript编写的,不需要编译,完全遵循MIT许可协议。

下面是一个如何使用它的例子:

var mysql = require('mysql')

var connection = mysql.createConnection({

host : 'localhost',

user : 'me',

password : 'secret',

database : 'my_db'

})

connection.connect()

connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {

if (err) throw err

console.log('The solution is: ', rows[0].solution)

})

connection.end()

从这个例子中,你可以了解到以下几点:

对于一个连接,你所调用的每个方法都是按顺序排队并依次执行的。

使用end()关闭连接,以确保给mysql服务器发送退出(quit)包以前执行所有剩余的查询。

推荐的建立链接的一个方法:

var mysql = require('mysql')

var connection = mysql.createConnection({

host : 'example.org',

user : 'bob',

password : 'secret'

})

connection.connect(function(err) {

if (err) {

console.error('error connecting: ' + err.stack)

return

}

console.log('connected as id ' + connection.threadId)

})

然后,我们可以通过建立一个连接来进行查询:

var mysql = require('mysql')

var connection = mysql.createConnection(...)

connection.query('SELECT 1', function(err, rows) {

// connected! (unless `err` is set)

})

以上二种方法都是正确且合适的。至于如何取舍,就要看你怎么去处理所遇到的错误了。不管哪种类型的错误,那都是致命的,我们需要去看所提示的具体的错误信息。

连接参数

在建立新连接时,可以设置以下参数:

host:连接的数据库地址。(默认:localhost)

port:连接地址对应的端口。(默认:3306)

localAddress: 源IP地址使用TCP连接。(可选)

socketPath:当主机和端口参数被忽略的时候,可以填写一个Unix的Socket地址。

user: mysql的连接用户名。

password: 对应用户的密码。

database: 所需要连接的数据库的名称。(可选)

charset: 连接的编码形式。这就是mysql中的整理。(例如:utf8_general_ci)如果被指定,则作为默认的整理排序规则。(默认:utf8_general_ci)

timezone:用来保存当前本地的时区。(默认:local)

connectTimeout: 设置在连接的时候,超过多久以后未响应则返回失败。(默认:10000)

stringifyObjects: stringify对象代替转换值。issue# 501。(默认:false)

insecureAuth:使用旧(不安全)的连接方式去连接MySQL。(默认:false)

typeCast: 确定列值是否需要转换为本地JavaScript类型。(默认:true)

queryFormat:自定义查询的方式。地址:Custom format.

supportBigNumbers: 如果你使用了BIGINT和DECIMAL格式的表列,那么需要开启这个参数来支持。(默认:false)只有当他们超过JavaScript所能表达的 最长的字节的时候,如果没有设置这个参数,则会将过长的数字作为字符串传递。否则,返回对象的长度。如果supportBigNumbers参数被忽略, 则这个参数也会被忽略。

dateStrings:一些日期类型(TIMESTAMP, DATETIME, DATE)会以Strings的类型返回,然后转换成JavaScript的日期对象。(默认:false)

debug:是否把连接情况打印到文件。(默认:false)

trace: 生成错误的堆栈跟踪,包括库入口的调用位置(“长堆栈的轨迹”)。一般会造成轻微的性能损失。(默认:true)

终止连接

终止连接的方法有两种。调用end()方法可以正常地终止一个连接:

connection.end(function(err) {

// 连接终止

})

这种方法将确保给MySQL服务器发送COM_QUIT包之前所有队列中的查询都会被执行。如果在发送COM_QUIT包之前发生了致命错误,那么会给回调函数传递一个err参数,但是不管怎样连接都会关闭。

另外一种终止连接的方法是调用destroy()方法。该方法会立即终止底层套接字(underlying socket)。另外,destroy()不会触发更多的事件和回调函数。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/6174704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-17
下一篇 2023-03-17

发表评论

登录后才能评论

评论列表(0条)

保存