Nodejs 使用Express构建网站时遇到的各种坑,分享经验,先做目录,慢慢写

Nodejs 使用Express构建网站时遇到的各种坑,分享经验,先做目录,慢慢写

  1. 守护进程问题 forever or nodejs写的shell的守护进程

  2. mysql连接问题,连接断开的问题,连接数不释放的问题

  3. 利用多核处理高并发问题

  4. 模板引擎的选择问题

  5. nginx代码转发nodejs请求

  6. phantomjs抓取的时候出现死进程问题

顺便贴一下网址,是做的一个简单的游戏

微信内置的,所以用微信打开会好一些,还没有完全处理完,事件都是触摸的,所以电脑上面实际上没法玩

疯狂猜电影小游戏


2 回复

Node.js 使用 Express 构建网站时遇到的各种坑,分享经验

目录

  1. 守护进程问题

    • 使用 forever 或编写 shell 脚本实现守护进程。
    • 示例代码:
      #!/bin/bash
      while true; do
        node app.js
        sleep 1
      done
      
  2. MySQL 连接问题

    • 解决连接断开、连接数不释放的问题。
    • 示例代码:
      const mysql = require('mysql');
      const pool = mysql.createPool({
        host: 'localhost',
        user: 'root',
        password: 'password',
        database: 'mydb'
      });
      
      pool.getConnection((err, connection) => {
        if (err) throw err;
        connection.query('SELECT * FROM users', (err, results) => {
          if (err) throw err;
          console.log(results);
          connection.release();
        });
      });
      
  3. 利用多核处理高并发问题

    • 使用 cluster 模块来处理高并发。
    • 示例代码:
      const cluster = require('cluster');
      const http = require('http');
      
      if (cluster.isMaster) {
        const numCPUs = require('os').cpus().length;
        for (let i = 0; i < numCPUs; i++) {
          cluster.fork();
        }
      } else {
        http.createServer((req, res) => {
          res.writeHead(200);
          res.end('Hello World!');
        }).listen(8000);
      }
      
  4. 模板引擎的选择问题

    • 比较 EJS 和 Pug 模板引擎。
    • 示例代码(使用 EJS):
      const express = require('express');
      const ejs = require('ejs');
      const app = express();
      
      app.set('view engine', 'ejs');
      app.get('/', (req, res) => {
        res.render('index', { title: 'Home Page' });
      });
      
      app.listen(3000);
      
  5. Nginx 代码转发 Node.js 请求

    • 配置 Nginx 将请求转发到 Node.js 应用。
    • 示例配置:
      server {
        listen 80;
        server_name example.com;
      
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection 'upgrade';
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
      
  6. PhantomJS 抓取时出现死进程问题

    • 如何处理 PhantomJS 在抓取过程中出现的死进程问题。
    • 示例代码:
      const phantom = require('phantom');
      
      async function run() {
        let instance;
        try {
          instance = await phantom.create();
          const page = await instance.createPage();
          const status = await page.open('http://example.com');
          console.log(status);
          const content = await page.property('content');
          console.log(content);
        } finally {
          if (instance) await instance.exit();
        }
      }
      
      run();
      

游戏链接

  • 疯狂猜电影小游戏疯狂猜电影小游戏

    这是一个微信内置的小游戏,目前还在开发中。游戏中的所有事件都基于触摸操作,因此在电脑上可能无法正常运行。

希望这些示例代码和解释能帮助你更好地理解和解决这些问题。


在使用 Node.js 和 Express 构建网站的过程中,确实会遇到一些常见的问题。这里我将列出一些常见的坑,并提供一些解决方案和示例代码。

目录

  1. 守护进程问题

    • 使用 forever 或者编写 shell 脚本以确保 Node.js 应用程序持续运行。
  2. MySQL 连接问题

    • 处理 MySQL 连接断开和连接数不释放的问题。
  3. 多核处理高并发问题

    • 如何利用 Node.js 的多核特性来处理高并发请求。
  4. 模板引擎的选择

    • 比较不同模板引擎的优缺点,并选择合适的模板引擎。
  5. Nginx 配置

    • 如何配置 Nginx 来转发 Node.js 请求。
  6. PhantomJS 死进程问题

    • 如何解决使用 PhantomJS 抓取页面时出现的死进程问题。

示例代码

1. 守护进程问题

使用 forever 工具来守护 Node.js 进程:

# 安装 forever
npm install -g forever

# 启动应用
forever start app.js

# 查看日志
forever logs

2. MySQL 连接问题

使用 mysql2 库,并设置连接池来管理数据库连接:

const mysql = require('mysql2/promise');

const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  database: 'test',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

async function queryDatabase(sql) {
  const [rows] = await pool.query(sql);
  return rows;
}

module.exports = { queryDatabase };

3. 多核处理高并发问题

使用 cluster 模块来利用多核 CPU:

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} died`);
  });
} else {
  // Workers can share any TCP connection
  // In this case it is an HTTP server
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
  }).listen(8000);

  console.log(`Worker ${process.pid} started`);
}

4. 模板引擎的选择

使用 EJS 模板引擎作为示例:

const express = require('express');
const ejs = require('ejs');

const app = express();

app.set('view engine', 'ejs');
app.get('/', (req, res) => {
  res.render('index', { title: 'Homepage' });
});

app.listen(3000, () => {
  console.log('App listening on port 3000!');
});

以上就是关于使用 Node.js 和 Express 构建网站时的一些常见问题及解决方案的总结。希望对你有所帮助!

回到顶部