Node.js数据库交互实战指南
立即解锁
发布时间: 2025-08-21 01:53:01 阅读量: 1 订阅数: 3 


Node.js服务器端JavaScript编程指南
### Node.js 数据库交互实战指南
在开发过程中,随着代码复杂度和目标需求的增加,我们很快会意识到需要一个合适的地方来存储数据。那么,如何选择最佳的数据存储方式呢?这取决于我们处理的数据类型,不同的挑战需要不同的解决方案。接下来,我们将详细介绍在 Node.js 中与各种数据库进行交互的方法,包括 CSV 文件、MySQL、MongoDB 等。
#### 一、写入 CSV 文件
CSV(Comma Separated Values)是一种常见的扁平文件结构数据库模型,每行代表一条记录,字段之间通常用逗号分隔。虽然可以使用多维数组和 `join` 方法来构建 CSV 结构,但这种方法存在局限性,例如当字段中包含逗号时会导致数据损坏,并且只能使用逗号作为分隔符。因此,我们可以使用第三方模块 `ya-csv` 来存储数据为 CSV 格式。
##### 1. 准备工作
- 创建一个名为 `write_to_csv.js` 的文件。
- 安装 `ya-csv` 模块:
```bash
npm install ya-csv
```
##### 2. 实现步骤
```javascript
var csv = require('ya-csv');
var writer = csv.createCsvFileWriter('data.csv');
var data = [['a','b','c','d','e','f','g'], ['h','i','j','k','l','m','n']];
data.forEach(function(rec) {
writer.writeRecord(rec);
});
```
运行上述代码后,打开 `data.csv` 文件,内容如下:
```
"a","b","c","d","e","f","g"
"h","i","j","k","l","m","n"
```
##### 3. 工作原理
`ya-csv` 可以处理 CSV 文件读写中的一些边缘情况,如文本中嵌入的逗号或引号。通过 `createCsvFileWriter` 方法创建一个 `CsvWriter` 实例,然后遍历数组,调用 `writeRecord` 方法将每条记录写入文件。`writeRecord` 方法会对数组进行重构,并将其传递给 `fs.WriteStream` 实例。需要注意的是,`writeRecord` 方法只接受数组作为参数,因此多维对象需要转换为合适的格式。
##### 4. 定制 CSV 元素
我们可以通过传递一个选项对象给 `createCsvFileWriter` 方法来定制 CSV 文件的元素,例如分隔符、引号和转义字符。
```javascript
var writer = csv.createCsvFileWriter('custom_data.csv', {
'separator': '~',
'quote': '|',
'escape': '|'
});
var data = [['a','b','c','d','e|','f','g'], ['h','i','j','k','l','m','n']];
```
运行上述代码后,`custom_data.csv` 文件内容如下:
```
|a|~|b|~|c|~|d|~|e|||~|f|~|g|
|h|~|i|~|j|~|k|~|l|~|m|~|n|
```
可以看到,`e` 字段中的管道字符后面添加了另一个管道字符进行转义。
##### 5. 读取 CSV 文件
`ya-csv` 还可以用于读取 CSV 文件,其内置的解析器会将每条 CSV 记录转换为数组。
```javascript
var csv = require('ya-csv');
var reader = csv.createCsvFileReader('data.csv');
var data = [];
reader.on('data', function(rec) {
data.push(rec);
}).on('end', function() {
console.log(data);
});
```
如果要解析使用其他分隔符和引号的 CSV 文件,可以在 `createCsvFileReader` 方法的选项对象中指定。
```javascript
var reader = csv.createCsvFileReader('custom_data.csv', {
'separator': '~',
'quote': '|',
'escape': '|'
});
```
##### 6. 将 CSV 作为流处理
`ya-csv` 可以将 CSV 文件作为流进行交互,这样可以减少操作内存,因为流允许我们在加载数据时逐块处理,而不是先将整个文件缓冲到内存中。
```javascript
var csv = require('ya-csv');
var http = require('http');
http.createServer(function (request, response) {
response.write('[');
csv.createCsvFileReader('big_data.csv')
.on('data', function(data) {
response.write(((this.parsingStatus.rows > 0) ? ',' : '') +
JSON.stringify(data));
}).on('end', function() {
response.end(']');
});
}).listen(8080);
```
#### 二、连接并向 MySQL 服务器发送 SQL
SQL(Structured Query Language)自 1986 年以来一直是关系型数据库的标准语言,MySQL 是最流行的 SQL 关系型数据库服务器之一,常用于 LAMP(Linux Apache MySQL PHP)堆栈。在 Node.js 中,我们可以使用第三方模块 `mysql` 来连接 MySQL 服务器并执行 SQL 查询。
##### 1. 准备工作
- 安装 `mysql` 模块:
```bash
npm install mysql
```
- 确保本地运行有 MySQL 服务器。可以使用以下命令检查 MySQL 是否已安装和运行:
```bash
whereis mysql
ps -ef | grep mysqld
```
如果 MySQL 已安装但未运行,可以使用以下命令启动:
```bash
sudo service mysql start
```
如果 MySQL 未安装,可以使用系统的包管理器进行安装,或者从 [http://dev.mysql.com/downloads/mysql](http://dev.mysql.com/downloads/mysql) 下载安装程序。
- 创建一个名为 `mysql.js` 的文件。
##### 2. 实现步骤
```javascript
var mysql = require('mysql');
var client = mysql.createClient({
user: 'root',
password: 'OURPASSWORD' ,
//debug: true
});
client.query('CREATE DATABASE quotes');
client.useDatabase('quotes');
client.query('CREATE TABLE quotes.quotes (' +
'id INT NOT NULL AUTO_INCREMENT, ' +
'author VARCHAR( 128 ) NOT NULL, ' +
'quote TEXT NOT NULL, PRIMARY KEY ( id )' +
')');
var ignore = [mysql.ERROR_DB_CREATE_EXISTS,
mysql.ERROR_TABLE_EXISTS_ERROR];
client.on('error', function (err) {
if (ignore.indexOf(err.number) > -1) { return; }
throw err;
});
client.query('INSERT INTO quotes.quotes (' +
'author, quote) ' +
'VALUES ("Bjarne Stroustrup", "Proof by analogy is fraud.");');
client.end();
```
##### 3. 工作原理
- `createClient` 方法用于建立与 MySQL 服务器的连接,并返回一个客户端实例,我们可以通过该实例与服务器进行交互。
- `client.query` 方法用于向数据库发送 SQL 语句,MySQL 服务器会执行这些语句。在上述代码中,我们创建了一个名为 `quotes` 的数据库和一个名为 `quotes` 的表,并插入了一条记录。
- `client.query` 会将传入的 SQL 语句排队,异步执行这些语句,同时在 SQL 语句队列中按顺序执行。当调用 `client.end` 时,关闭连接的任务会添加到队列末尾。如果想立即关闭连接,可以使用 `client.destroy`。
- `ignore` 数组用于过滤数据库或表已存在
0
0
复制全文
相关推荐










