用Nodejs做的小站粗糙的完工

发布于 1周前 作者 caililin 来自 nodejs/Nestjs

用Nodejs做的小站粗糙的完工

用node做的小站粗糙的完工(注册,登录,发布,评论,分页,上传图片)。。。。 在node.js上用时2.5天,开发速度不如PHP,另外,使用mysql是个很不好的选择,打算换成mongo

7 回复

当然可以。以下是一个基于Node.js、Express框架、MySQL数据库和MongoDB数据库的小站示例。我们将展示如何实现用户注册、登录、发布文章、添加评论以及图片上传功能。此外,还将展示如何从MySQL迁移到MongoDB。

1. 使用Node.js和Express搭建基本站点

首先,我们需要安装必要的依赖包:

npm init -y
npm install express mysql2 multer

Express服务器设置

const express = require('express');
const app = express();
const port = 3000;

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// 路由设置
app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.listen(port, () => {
    console.log(`Server is running on http://localhost:${port}`);
});

2. 用户注册与登录

假设我们使用MySQL数据库进行用户管理:

const mysql = require('mysql2');

const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    database: 'testdb'
});

app.post('/register', (req, res) => {
    const { username, password } = req.body;
    pool.query(
        'INSERT INTO users (username, password) VALUES (?, ?)',
        [username, password],
        (err, result) => {
            if (err) throw err;
            res.send('User registered successfully');
        }
    );
});

app.post('/login', (req, res) => {
    const { username, password } = req.body;
    pool.query(
        'SELECT * FROM users WHERE username = ? AND password = ?',
        [username, password],
        (err, results) => {
            if (results.length > 0) {
                res.send('Login successful');
            } else {
                res.send('Invalid credentials');
            }
        }
    );
});

3. 迁移到MongoDB

接下来,我们将用户管理迁移到MongoDB:

const MongoClient = require('mongodb').MongoClient;

const url = 'mongodb://localhost:27017';
const dbName = 'testdb';

MongoClient.connect(url, function(err, client) {
    if (err) throw err;
    const db = client.db(dbName);
    const collection = db.collection('users');

    app.post('/register', (req, res) => {
        const { username, password } = req.body;
        collection.insertOne({ username, password }, (err, result) => {
            if (err) throw err;
            res.send('User registered successfully');
        });
    });

    app.post('/login', (req, res) => {
        const { username, password } = req.body;
        collection.findOne({ username, password }, (err, result) => {
            if (result) {
                res.send('Login successful');
            } else {
                res.send('Invalid credentials');
            }
        });
    });
});

4. 图片上传

使用multer库来处理文件上传:

npm install multer
const multer = require('multer');
const path = require('path');

const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, 'uploads/')
    },
    filename: function (req, file, cb) {
        cb(null, Date.now() + path.extname(file.originalname))
    }
});

const upload = multer({ storage: storage });

app.post('/upload', upload.single('image'), (req, res) => {
    res.send('File uploaded successfully');
});

以上就是用Node.js构建一个简单的网站,并且展示了如何从MySQL迁移到MongoDB的过程。希望这些示例对你有所帮助!


和我做的功能都差不多。。。支持一下,发地址吧。。

还能上传图片啦,地址~

如果提前说开发速度没有php快就有点为时尚早,毕竟不是拿具有同等资质的2类做比较,不过我一直看好node

希望lz开源出来

对于“用Nodejs做的小站粗糙的完工”这个帖子,可以总结出你已经完成了一个包含注册、登录、发布内容、评论和分页功能的小型网站。以下是一些基本示例代码和建议,帮助你理解这些功能是如何实现的。

注册与登录

这里你可以使用Express框架来搭建服务器,并配合express-session库来处理会话管理,以及bcryptjs库对密码进行加密。

const express = require('express');
const bcrypt = require('bcryptjs');
const session = require('express-session');

const app = express();
app.use(session({
    secret: 'secret-key',
    resave: false,
    saveUninitialized: false
}));

app.post('/register', (req, res) => {
    // 假设你已经有了一个数据库连接
    const { username, password } = req.body;
    bcrypt.hash(password, 10, (err, hash) => {
        if (err) throw err;
        // 将用户信息存储到数据库中
        // ...
        req.session.user = username;
        res.redirect('/');
    });
});

app.post('/login', (req, res) => {
    const { username, password } = req.body;
    // 假设你已经有了一个数据库查询语句
    // 查询用户是否存在
    // ...
    if (/* 用户存在 */) {
        bcrypt.compare(password, result.password, (err, match) => {
            if (err) throw err;
            if (match) {
                req.session.user = username;
                res.redirect('/');
            } else {
                res.send('密码错误');
            }
        });
    } else {
        res.send('用户不存在');
    }
});

发布内容与评论

你可以使用MongoDB替代MySQL,因为MongoDB更适合Node.js环境,并且操作更简便。使用Mongoose作为ORM工具可以简化数据模型的定义和操作。

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/my_database', { useNewUrlParser: true });

const postSchema = new mongoose.Schema({
    title: String,
    content: String,
    author: String,
    createdAt: Date
});

const Post = mongoose.model('Post', postSchema);

app.post('/post', (req, res) => {
    const { title, content, author } = req.body;
    const post = new Post({ title, content, author, createdAt: new Date() });
    post.save((err) => {
        if (err) throw err;
        res.redirect('/');
    });
});

分页

分页可以通过在数据库查询时添加skip()limit()方法实现。

app.get('/', async (req, res) => {
    const page = parseInt(req.query.page) || 1;
    const limit = 10; // 每页显示的文章数量
    const skip = (page - 1) * limit;

    try {
        const posts = await Post.find().skip(skip).limit(limit);
        res.render('index', { posts });
    } catch (err) {
        console.error(err);
        res.status(500).send('Server Error');
    }
});

图片上传

可以使用Multer库来处理文件上传。

const multer = require('multer');
const path = require('path');

const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, 'uploads/')
    },
    filename: function (req, file, cb) {
        cb(null, Date.now() + path.extname(file.originalname))
    }
});

const upload = multer({ storage: storage });

app.post('/upload', upload.single('image'), (req, res) => {
    res.send('Image uploaded successfully');
});

希望这些示例能帮助你更好地理解和改进你的项目!

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!