Mongoose.create 创建文档但没有我的数据
Posted
技术标签:
【中文标题】Mongoose.create 创建文档但没有我的数据【英文标题】:Mongoose.create creating document but none of my data 【发布时间】:2017-01-04 08:33:27 【问题描述】:我正在学习使用平均堆栈并尝试构建一个网址缩短器。我有一个模块,它接受 req.params.UserUrl 检查并确保它是一个有效的 url,然后创建一个我想用作短路径的随机数。我似乎找不到保存随机数的方法,以便我可以检查他们的下一个 url 请求。在谷歌搜索之后,似乎最有效的方法是使用 long_url 和 short_url:randomNumber 将对象保存在数据库中。我的代码没有抛出任何错误,但是当我检查我的 heroku 数据库时,它有一个新条目,但只有 mLabs 自己生成的 _id 和 __v。有人可以告诉我哪里出错了。
路由文件
var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var URLShortener = require(process.cwd()+'/public/Modules/urlShortener.module.js');
var ShortURL = require('../models/shortUrl.js');
router.get('/', function(req, res)
res.render('index', title: 'FreeCodeCamp Projects' );
);
router.get('/urlShortener', function(req, res)
res.render('freecodecamp/urlShortener', title: 'Url Shortener Site');
);
router.get('/urlShortener/:userUrl', function(req, res)
if(URLShortener.checkValidUrl(req.params.userUrl))
var UserUrl = req.params.userUrl;
var randNbr = URLShortener.assignRanNbr();
ShortURL.create(URLShortener.createUrlObj(UserUrl, randNbr), function (err, smallUrl)
if (err) return console.log(err);
else res.json(smallUrl);
);
else
res.send('Invalid url');
);
router.get('/:short', function(req, res)
if(randNbr == req.params.short)
res.redirect(userUrl);
else
res.send('Not the correct shortcut');
);
module.exports = router;
网址架构
var mongoose = require('mongoose')
var Schema = mongoose.Schema
var shortUrlSchema = new Schema(
long_id:String,
short_id:Number
, collection: 'shortUrl');
module.exports = mongoose.model('shortUrl', shortUrlSchema);
urlShortener 模块
'use strict'
module.exports.checkValidUrl = function(url)
var pattern = new RegExp(/((([A-Za-z]3,9:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/);
return pattern.test(url);
module.exports.assignRanNbr = function()
var randNbr = Math.floor(Math.random() * (9999 - 1 + 1)) + 1;
return randNbr;
module.exports.createUrlObj = function(url, num)
var urlObj = ;
urlObj.original_url = url;
urlObj.short_url = 'https://rawlejuglal-me-rawlejuglal-1.c9users.io/freecodecamp/'+num;
return urlObj;
【问题讨论】:
【参考方案1】:您的 createUrlObj 方法返回一个具有属性original_url
和short_url
的对象,但您的shortUrlSchema 属性是long_id
和short_id
。 create 方法中的属性名称需要与您的架构匹配。属性值类型还必须与您的模式类型匹配(目前short_url
是一个字符串,short_id
是一个数字)。我认为你真正想要的是你的 createUrlObj 方法是
module.exports.createUrlObj = function(url, num)
var urlObj = ;
urlObj.long_url = url;
urlObj.short_id = num;
return urlObj;
你的架构是
var shortUrlSchema = new mongoose.Schema(
long_url: String,
short_id: Number
, collection: 'shortUrl');
此外,您的'/:short'
路由应该调用数据库,因为该路由中没有定义randNbr
和userUrl
变量。
router.get('/:short', function(req, res)
ShortUrl.findOne(short_id: req.params.short, function(err, shortUrl)
if(err) res.send('Invalid Url');
res.redirect(shortUrl.long_url)
)
);
【讨论】:
嘿,我可以再问一个问题吗?一切都在处理 res.redirect。我的 app.js 文件有 app.use('/freeCodeCamp', freeCodeProjects);具有包含这些路线的正确要求。所以当我访问 '/:short' 时,它真的是 freecodecamp/:short。如何让它在没有 freecodecamp/(shortUrl.long_url) 的情况下重定向,因为现在控制台似乎将 freecodecamp/ 放在它前面 您需要传递一个完全限定的 url,其中包含“http://”。尝试做 res.redirect("http://" + shortUrl.long_url) 谢谢,就是这样。你是最棒的!以上是关于Mongoose.create 创建文档但没有我的数据的主要内容,如果未能解决你的问题,请参考以下文章
mongoose .create 给 node.js “ValidationError:验证失败:转换为 [undefined] 值失败......”
我正在尝试使用 knownTravelerNumber 创建 SABRE SpecialServiceRQ,但文档没有帮助