Nodejs 如何在httpserver之前操作Mysql数据库

Nodejs 如何在httpserver之前操作Mysql数据库

现在有个需求,node http server启动之前,需要到mysql查询一些数据,根据查询得到的数据,http决定每次返回的数据

伪代码

var price = -1; var userId = ‘some user provided value’; var sql = 'SELECT max(price) FROM users WHERE id = ’ + connection.escape(userId); connection.query(sql, function(err, results) { price = results.price; });

server = http.createServer(function (request, response) { handler(request); }).listen(8012);

主要想问一下,查询mysql和处理http请求之间是异步的吗? 如果是异步的,怎么保证在处理http请求之前,我查询mysql然后做一写操作呢?


4 回复

在 Node.js 中,与 MySQL 数据库的交互通常是异步的。这意味着在查询数据库时,你的程序不会阻塞等待结果,而是会继续执行其他任务。为了确保在处理 HTTP 请求之前完成数据库查询,你需要使用回调函数或 Promise 等机制来管理异步操作。

以下是一个完整的示例代码,展示了如何在启动 HTTP 服务器之前查询 MySQL 数据库,并将查询结果用于 HTTP 响应:

const mysql      = require('mysql');
const http       = require('http');

// 创建一个 MySQL 连接池
const pool = mysql.createPool({
  host     : 'localhost',
  user     : 'your_username',
  password : 'your_password',
  database : 'your_database'
});

let price = -1;

// 查询 MySQL 数据库
pool.query('SELECT max(price) AS price FROM users WHERE id = ?', ['some user provided value'], function (err, results) {
  if (err) throw err;
  
  // 获取查询结果中的价格
  price = results[0].price;
  
  // 启动 HTTP 服务器
  const server = http.createServer((request, response) => {
    handler(request, response, price);
  }).listen(8012, () => {
    console.log(`Server running at http://localhost:8012/`);
  });
});

function handler(request, response, price) {
  // 使用查询到的价格处理 HTTP 请求
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end(`Price: ${price}`);
}

解释

  1. 创建 MySQL 连接池

    const pool = mysql.createPool({
      host     : 'localhost',
      user     : 'your_username',
      password : 'your_password',
      database : 'your_database'
    });
    

    使用连接池可以更有效地管理数据库连接。

  2. 查询 MySQL 数据库

    pool.query('SELECT max(price) AS price FROM users WHERE id = ?', ['some user provided value'], function (err, results) {
      if (err) throw err;
      
      // 获取查询结果中的价格
      price = results[0].price;
      
      // 启动 HTTP 服务器
      const server = http.createServer((request, response) => {
        handler(request, response, price);
      }).listen(8012, () => {
        console.log(`Server running at http://localhost:8012/`);
      });
    });
    

    使用 query 方法执行 SQL 查询。查询结果通过回调函数传递,确保在启动 HTTP 服务器之前获取了查询结果。

  3. 处理 HTTP 请求

    function handler(request, response, price) {
      // 使用查询到的价格处理 HTTP 请求
      response.writeHead(200, {'Content-Type': 'text/plain'});
      response.end(`Price: ${price}`);
    }
    

    在处理 HTTP 请求时,使用从数据库中获取的价格。

通过这种方式,你可以确保在处理 HTTP 请求之前完成数据库查询,并将查询结果用于 HTTP 响应。


把server.listen(8012)放在function(err,results){}回调里面不就行了吗?

handler(request)需要用到price

对于这个问题,查询MySQL数据库的操作与处理HTTP请求之间确实是异步的。在Node.js中,大多数I/O操作都是异步的,这使得Node.js能够高效地处理并发请求。

为了确保在处理HTTP请求之前完成MySQL查询,你需要等待查询的结果,并且只在获取到查询结果之后再启动HTTP服务器。你可以使用Promise或者async/await语法来处理这种异步操作。

以下是一个简单的例子,展示了如何使用async/await来解决这个问题:

const mysql = require('mysql');
const http = require('http');

// 创建数据库连接
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'database'
});

async function getPrice(userId) {
  return new Promise((resolve, reject) => {
    const sql = `SELECT max(price) AS price FROM users WHERE id = ${connection.escape(userId)}`;
    connection.query(sql, (err, results) => {
      if (err) {
        return reject(err);
      }
      resolve(results[0].price);
    });
  });
}

async function startServer() {
  try {
    const userId = 'some user provided value';
    const price = await getPrice(userId);

    // 启动HTTP服务器
    const server = http.createServer((request, response) => {
      handler(request, response, price);
    }).listen(8012);

    console.log(`Server is running on port 8012 with price: ${price}`);
  } catch (error) {
    console.error('Error:', error);
  }
}

function handler(request, response, price) {
  response.writeHead(200, { 'Content-Type': 'text/plain' });
  response.end(`Price: ${price}`);
}

startServer();

在这个例子中,getPrice 函数返回一个Promise,当查询完成后会解析为价格值。startServer 是一个异步函数,它首先调用 getPrice 获取价格,然后创建并启动HTTP服务器。这样可以确保在HTTP服务器开始监听端口之前,已经完成了数据库查询。

回到顶部