Mongoose.create 创建文档但 none 我的数据
Mongoose.create creating document but none of my data
我正在学习使用平均堆栈并尝试构建一个 url 缩短器。我有一个模块接受 req.params.UserUrl 检查并确保它是有效的 url 然后创建一个我想用作短路的随机数。我似乎无法找到一种方法来保存随机数,以便我可以根据它检查他们的下一个 url 请求。在 google 搜索之后,最有效的方法似乎是使用 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;
Url 架构
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);
url缩短模块
'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;
}
您的 createUrlObj 方法正在返回一个具有属性 original_url
和 short_url
的对象,但您的 shortUrlSchema 属性是 long_id
和 short_id
。创建方法中的 属性 名称需要与您的模式匹配。 属性 值类型还必须匹配您的架构类型(目前 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)
})
});
我正在学习使用平均堆栈并尝试构建一个 url 缩短器。我有一个模块接受 req.params.UserUrl 检查并确保它是有效的 url 然后创建一个我想用作短路的随机数。我似乎无法找到一种方法来保存随机数,以便我可以根据它检查他们的下一个 url 请求。在 google 搜索之后,最有效的方法似乎是使用 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;
Url 架构
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);
url缩短模块
'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;
}
您的 createUrlObj 方法正在返回一个具有属性 original_url
和 short_url
的对象,但您的 shortUrlSchema 属性是 long_id
和 short_id
。创建方法中的 属性 名称需要与您的模式匹配。 属性 值类型还必须匹配您的架构类型(目前 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)
})
});