关于Nodejs路径或者数据库查询问题求救

关于Nodejs路径或者数据库查询问题求救

我想让博客的页面的路径是/u/post._id ,_id为增加post文章时候,数据库自动生成的,链接我是这样写的, <a href="/u/<%= post._id %>"><%= post.title %></a>, 路由是这样写的 app.get(’/u/:post._id’, function (req, res) { Post.getOne(req.params.post._id , function (err, post) {… 数据库查询我是这样写的 Post.getOne = function(_id, callback) { mongodb.open(function (err, db) { if (err) { return callback(err); } db.collection(‘posts’, function (err, collection) { if (err) { mongodb.close(); return callback(err); } collection.findOne({ _id: ObjectId.createFromHexString(_id) }, function (err, result) { mongodb.close(); if (err) { return callback(err); } callback(null); }); }); }); };


4 回复

当然可以。根据你的描述,你希望实现一个功能,即通过特定的路径 /u/:postId 来访问并显示某个特定的博客文章。为了实现这一点,你需要确保以下几个方面:

  1. 路由配置:正确地设置路由来匹配 URL 路径。
  2. 数据库查询:从数据库中获取指定的文章数据。
  3. 渲染视图:将获取到的数据渲染到前端页面。

下面是改进后的代码示例,包括路由、数据库查询以及如何将数据传递给视图进行渲染:

1. 路由配置

首先,你需要确保路由能够正确匹配 URL 路径,并调用相应的处理函数。

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

// 假设你已经定义了 Post 模型或模块
const Post = require('./models/Post'); // 请根据实际情况调整路径

app.get('/u/:postId', async (req, res) => {
    try {
        const postId = req.params.postId;
        const post = await Post.getOne(postId);

        if (!post) {
            return res.status(404).send('Post not found');
        }

        // 渲染视图并将 post 数据传递给视图
        res.render('post', { post });
    } catch (error) {
        console.error(error);
        res.status(500).send('Server error');
    }
});

// 启动服务器
app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

2. 数据库查询

假设你使用的是 MongoDB 和 Mongoose,你可以定义一个模型方法来查询数据库中的单个文档。

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 定义 Post 模型
const postSchema = new Schema({
    title: String,
    content: String,
    // 其他字段...
});

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

module.exports = Post;

// 在另一个文件中,例如 models/Post.js
Post.getOne = async function (_id) {
    try {
        const post = await this.findById(_id).exec();
        return post;
    } catch (error) {
        throw new Error('Failed to fetch post');
    }
};

3. 视图渲染

假设你使用的是 EJS 作为模板引擎,你可以在 post.ejs 文件中使用传递的数据来渲染页面。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><%= post.title %></title>
</head>
<body>
    <h1><%= post.title %></h1>
    <p><%= post.content %></p>
</body>
</html>

总结

通过以上步骤,你就可以实现通过 /u/:postId 路径来访问并显示特定的博客文章。确保你的数据库连接和模型定义正确无误,并且视图文件也正确配置以接收和显示数据。


链接是这样的href="/u/<%= post._id %,发表之后才看到这里自动把a标签给转化了,

哪位大神给点指点

根据你的描述,你希望实现一个功能,使得访问路径 /u/:post._id 可以正确地显示指定 _id 的文章。当前代码有几个地方需要修改和完善。

修改后的路由代码

app.get('/u/:postId', function (req, res) {
    Post.getOne(req.params.postId, function (err, post) {
        if (err) {
            return res.status(500).send('Server error');
        }
        if (!post) {
            return res.status(404).send('Post not found');
        }
        res.render('post', { post: post });
    });
});

修改后的数据库查询代码

确保 ObjectId 正确引入,并且查询函数返回正确的结果:

const ObjectId = require('mongodb').ObjectID;

Post.getOne = function(_id, callback) {
    mongodb.open(function (err, db) {
        if (err) {
            return callback(err);
        }
        db.collection('posts', function (err, collection) {
            if (err) {
                mongodb.close();
                return callback(err);
            }
            collection.findOne({
                _id: ObjectId.createFromHexString(_id)
            }, function (err, result) {
                mongodb.close();
                if (err) {
                    return callback(err);
                }
                callback(null, result); // 返回查询结果
            });
        });
    });
};

解释

  1. 路由参数: 在路由中使用 req.params.postId 来获取 URL 中的 _id 参数。
  2. 错误处理: 在路由和数据库查询中添加适当的错误处理逻辑,如 500 错误(服务器错误)和 404 错误(未找到文章)。
  3. 数据库查询: 使用 ObjectId.createFromHexString(_id) 将传入的字符串 _id 转换为 ObjectId 类型,以便 MongoDB 查询。
  4. 回调函数: 在数据库查询完成后,确保返回查询到的结果给回调函数,以便在路由中正确处理数据。

通过以上修改,你的路由将能够正确处理请求并显示对应的博客文章。

回到顶部