Javascript NodeJS posts.findOne(…返回404未找到
我正在整理一个来自NodeJs、Pug、Express、Monk等的博客,从db检索一篇文章时遇到问题。我一直收到一个404 not found错误。我不确定我做错了什么,但如果你能扫描我的代码,看看我是否遗漏了什么,我一定会非常感激 posts.jsJavascript NodeJS posts.findOne(…返回404未找到,javascript,node.js,pug,monk,Javascript,Node.js,Pug,Monk,我正在整理一个来自NodeJs、Pug、Express、Monk等的博客,从db检索一篇文章时遇到问题。我一直收到一个404 not found错误。我不确定我做错了什么,但如果你能扫描我的代码,看看我是否遗漏了什么,我一定会非常感激 posts.js var express = require("express"); var router = express.Router(); var multer = require("multer"); var upload = multer({ dest
var express = require("express");
var router = express.Router();
var multer = require("multer");
var upload = multer({ dest: "./public/images" });
var mongo = require("mongodb");
var db = require("monk")("localhost/nodeblog");
router.get("/show/:id", function (req, res, next) {
var posts = db.get("posts");
posts.findOne({ '_id': req.params.id }, function (err, post) {
res.render("show", {
'post': post
});
});
});
app.js
var express = require("express");
var path = require("path");
var favicon = require("serve-favicon");
var logger = require("morgan");
var cookieParser = require("cookie-parser");
var bodyParser = require("body-parser");
var session = require("express-session");
var multer = require("multer");
var upload = multer({ dest: "./public/images" });
var expressValidator = require("express-validator");
var mongo = require("mongodb");
var db = require("monk")("localhost/nodeblog");
var routes = require("./routes/index");
var posts = require("./routes/posts");
var categories = require("./routes/categories");
var app = express();
app.locals.moment = require("moment");
app.locals.truncateText = function(text, length) {
var truncatedText = text.substring(0, length);
return truncatedText;
};
// view engine setup
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "pug");
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger("dev"));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, "public")));
// Express Session
app.use(
session({
secret: "secret",
saveUninitialized: true,
resave: true
})
);
// Express Validator
app.use(
expressValidator({
errorFormatter: function(param, msg, value) {
var namespace = param.split("."),
root = namespace.shift(),
formParam = root;
while (namespace.length) {
formParam += "[" + namespace.shift() + "]";
}
return {
param: formParam,
msg: msg,
value: value
};
}
})
);
// Connect-Flash
app.use(require("connect-flash")());
app.use(function(req, res, next) {
res.locals.messages = require("express-messages")(req, res);
next();
});
// Make our db accessible to our router
app.use(function(req, res, next) {
req.db = db;
next();
});
app.use("/", routes);
app.use("/posts", posts);
app.use("/categories", categories);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error("Not Found");
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get("env") === "development") {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render("error", {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render("error", {
message: err.message,
error: {}
});
});
module.exports = app;
categories.js index.js和posts.js都在routes文件夹中。
在视图文件夹中,我有addcategory.pug、addpost.pug、error.pug、index.pug、layout.pug和show.pug
如果您需要查看其中任何一个,请告诉我,我将编辑此查询。谢谢
index.js
var express = require("express");
var router = express.Router();
var mongo = require("mongodb");
var db = require("monk")("localhost/nodeblog");
/* GET home page. */
router.get("/", function(req, res, next) {
var db = req.db;
var posts = db.get("posts");
posts.find({}, {}, function(err, posts) {
res.render("index", { posts: posts });
});
});
module.exports = router;
categories.js
var express = require("express");
var router = express.Router();
var mongo = require("mongodb");
var db = require("monk")("localhost/nodeblog");
router.get("/show/:category", function(req, res, next) {
var posts = db.get("posts");
posts.find({ category: req.params.category }, {}, function(err, posts) {
res.render("index", {
title: req.params.category,
posts: posts
});
});
});
router.get("/add", function(req, res, next) {
res.render("addcategory", {
title: "Add Category"
});
});
router.post("/add", function(req, res, next) {
// Get Form Values
var name = req.body.name;
// Form Validation
req.checkBody("name", "Name field is required").notEmpty();
// Check Errors
var errors = req.validationErrors();
if (errors) {
res.render("addpost", {
errors: errors
});
} else {
var categories = db.get("categories");
categories.insert(
{
name: name
},
function(err, post) {
if (err) {
res.send(err);
} else {
req.flash("success", "Category Added");
res.location("/");
res.redirect("/");
}
}
);
}
});
module.exports = router;
哈巴狗
extends layout
block content
.post
h1=post.title
p.meta Posted in
a.category-link(href='/categories/show/' + post.category) #{post.category}
| by #{post.author} on #{moment(post.date).format("MM-DD-YYYY")}
img.main-image(src='/images/' + post.mainimage)
!=post.body
原来我有
posts.findById(
但这也不起作用
在此方面的任何帮助都将不胜感激。请提前感谢。此代码导致了此问题
app.use(function(req, res, next) {
var err = new Error("Not Found");
err.status = 404;
next(err);
});
实际上,这段代码是一个中间件,它将每个请求的状态更改为404。这段代码就是问题的根源
app.use(function(req, res, next) {
var err = new Error("Not Found");
err.status = 404;
next(err);
});
实际上,这段代码是一个中间件,它将每个请求的状态更改为404。您应该通过使用mongoDB模块将id参数转换为objectId来传递它
var ObjectId = require("mongodb").ObjectId;
router.get("/show/:id", function (req, res, next) {
var posts = db.get("posts");
posts.findOne({ '_id': new ObjectId(req.params.id }, function (err, post) {
res.render("show", {
'post': post
});
});
});```
应该通过使用mongoDB模块转换id参数,将其作为objectId传递
var ObjectId = require("mongodb").ObjectId;
router.get("/show/:id", function (req, res, next) {
var posts = db.get("posts");
posts.findOne({ '_id': new ObjectId(req.params.id }, function (err, post) {
res.render("show", {
'post': post
});
});
});```
我建议您使用
findById
,就像您通过id
查找一样,并使用promise。在您的情况下,它将类似于:
posts.findById({ '_id': req.params.id })
.then(post => {
res.render(post)
})
.catch(error => {
console.log(error)
})
我建议您使用
findById
,就像您通过id
查找一样,并使用promise。在您的情况下,它将类似于:
posts.findById({ '_id': req.params.id })
.then(post => {
res.render(post)
})
.catch(error => {
console.log(error)
})
我应该删除该代码吗?还是使用if?if err,err else''谢谢你,是的,删除它,因为我不确定它应该实现什么。删除该部分代码后,我现在无法获得/posts/show/。{post.\u id}是地址栏中显示的内容,这将是因为您的路由设置不正确。我需要查看路由中的代码并发布更新的问题。请告诉我是否应该添加其他内容,我会添加。谢谢。我应该删除该代码吗?还是使用if?if err,err else“”谢谢您删除它,因为我不确定我要添加什么t应该实现cannot GET/posts/show/是我在删除该部分代码后现在得到的。{post.\u id}是地址栏中显示的内容,这将是因为您的路线设置不正确。我需要查看路线中的代码并发布更新的问题。请告诉我是否需要添加其他内容,我会的。谢谢。我明天会尝试一下,并让您知道这是否有效。谢谢您的贡献。编辑:我已经提供了一次尝试,但不幸的是,它仍然给出相同的无法获取/posts/show/error。我明天会尝试一下,并让您知道这是否有效。感谢您的贡献。编辑:我尝试了一次,但不幸的是,它仍然给出相同的无法获取/posts/show/error。感谢您的帮助。不幸的是,由于我使用了Monk,我认为我不是我尝试了你的建议,但它给了我同样的结果。我可能会更好地使用mongoose。那么现在你正在使用mongoose?@ErikJamesRobles因为我是一个新手,我将不得不学习如何将我现有的代码转换成mongoose而不会太坏。与此同时,我将尝试提出一个解决方案ion并希望将其发布在此处,以防其他人与Monk有相同的问题。感谢您的帮助。不幸的是,由于我使用Monk,我认为我无法实现这一目标。我尝试了您的建议,但它给了我相同的结果。我可能会更好地使用mongoose。因此,现在您使用mongoose?@ErikJamesrobles,因为我是我是一个新手,我必须学会如何将我现有的代码转换成mongoose而不至于太坏。与此同时,我将尝试提出一个解决方案,希望能在这里发布,以防其他人与Monk有同样的问题。