我正在编写一个食谱组织者作为课程的示例项目.除了使用一些非常基本的功能之外,我对DRF不是很有经验.这是目标:
使用相关成分创建新配方.在创建Recipe对象的同时创建Ingredient对象.
models.py:
class Ingredient(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Recipe(models.Model):
name = models.CharField(max_length=100)
description = models.TextField(blank=True, null=True, help_text="This is a quick description of your recipe")
directions = models.TextField(help_text="How to make the recipe")
ingredients = models.ManyToManyField(Ingredient)
def __str__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
serializers.py
class IngredientSerializer(serializers.ModelSerializer):
class Meta:
model = Ingredient
class RecipeSerializer(serializers.ModelSerializer):
ingredients = IngredientSerializer(many=True)
class Meta:
model = Recipe
def create(self, validated_data):
ingredients_data = validated_data.pop('ingredients')
recipe = Recipe.objects.create(**validated_data)
for ingredient_data in ingredients_data:
Ingredient.objects.create(**ingredient_data)
return recipe
Run Code Online (Sandbox Code Playgroud)
这样可以在数据库中成功创建Recipe对象和Ingredients对象,但不会将Ingredients列表与Recipe关联.我认为这是因为当我运行时ingredients_data = …
我有一种感觉,这将是一个快速的答案,但我似乎无法在网上找到任何明确的答案 - jsonwebtoken npm包和express-jwt npm包之间的区别是什么?我认为 express-jwt是在jsonwebtoken之上编写的,只是验证传入的令牌并设置req.user为JWT上的用户有效负载.
那是对的吗?很抱歉,如果这是一个总的noob问题...我刚刚开始学习身份验证和node/express,所以这对我来说都是新手.
我在测试node.js文件时找到了Jasmine 2.4的页面,它甚至提到在spec/support/jasmine.json文件中设置spec 和source文件.但是,无论是在线的例子,也不该jasmine examples如何告诉茉莉在哪里可以找到源文件显示任何东西.
所以我一直在使用ReferenceErrors,因为它似乎没有在我的源文件中读取.应该指出的是,现在我只是用它来教一些学生测试,并使用他们的单文件玩具项目进行练习.(就像CLI Hangman Game一样.)所以现在还没有module.exports继续进行,尽管他们的一些项目require()用来引入第三方模块.我一直在使用Karma,直到我意识到它只应该用于浏览器JavaScript,并且require一直都在失败.
编辑:我刚发现这篇帖子基本上都是一样的问题,但我不想使用grunt只是为了让Jasmine在源文件中读取.看起来像应该内置的东西,比如Karma如何询问源文件和规范文件的位置.
第二次编辑:我不应该把它放在这里,但是Emarco将我的问题标记为我在上面的第一次编辑中链接的那个,即使我非常具体地解释了为什么其他帖子没有回答我的问题.
这可能只是因为误解了如何在MEAN堆栈应用程序中进行最佳身份验证,或者我对promises和$ http .then()方法的工作方式缺乏了解,但每当我尝试使用不正确的凭据对我的后端节点服务器进行身份验证时,它就是调用$ http .then()方法的成功回调而不是错误回调.这是我的设置:
我正在使用jsonwebtoken和express-jwt包,AngularJS拦截器添加请求的令牌并检查状态401 responseErrors,设置/删除的TokenService等JWT,以及用于处理登录,注销等的UserService.
从调试开始,这是正在发生的事情:
responseError方法,正确地看到它是状态401,删除任何可能的现有令牌,重定向到/login屏幕和returns $q.reject(response).UserService.login()正确使用错误回调并执行return response..login()方法中的成功回调运行,而不是第二个错误回调.我有一种感觉这与本文中讨论的关于承诺链的内容有关,但我的专业知识在这里有其限制,我无法理解我接下来应该做什么来告诉链中的下一个回调前一个有错误...这是我的设置:
authRoutes.post("/login", function (req, res) {
User.findOne({username: req.body.username}, function (err, user) {
if (err) res.status(500).send(err);
if (!user) {
res.status(401).send({success: false, message: "User with the provided username was not found"})
} else if (user) {
bcrypt.compare(req.body.password, user.password, function (err, match) {
if …Run Code Online (Sandbox Code Playgroud) javascript authentication jwt angularjs angular-http-interceptors
我过去使用过npm包express-jwt来进行简单的JWT签名,解码等.通常(根据文档)它拦截请求,用用户对象有效负载解码令牌并设置req.user为该有效负载.但是,这一次显示它req.user看起来像这样:
{ '$__':
{ strictMode: true,
getters: {},
wasPopulated: false,
activePaths: { paths: [Object], states: [Object], stateNames: [Object] },
emitter: { domain: null, _events: {}, _maxListeners: 0 } },
isNew: false,
_doc:
{ __v: 0,
password: '$2a$10$ypbCbWsEA7W17IQjdox5Oe..MhhCco/0yIw.J1Y6m6vJDllCB0LLS',
username: 'b',
lastname: 'Last',
firstname: 'First',
_id: '56969210e3f8bf2ab9aee66d' },
_pres: { '$__original_save': [ null, null, null ] },
_posts: { '$__original_save': [] },
iat: 1452709101
}
Run Code Online (Sandbox Code Playgroud)
而不仅仅是:
{
__v: 0,
password: '$2a$10$ypbCbWsEA7W17IQjdox5Oe..MhhCco/0yIw.J1Y6m6vJDllCB0LLS',
username: 'b',
lastname: 'Last',
firstname: …Run Code Online (Sandbox Code Playgroud) 我在有关如何使用react-stripe-elements创建自定义字段(如电话号码)的文档中迷失了。我已经获得了一个使用该<CardElement>组件收集卡信息的快速示例,但是我看不到任何地方如何向要令牌化的数据中添加电话号码的另一个输入。
我知道我可以从内置字段中接收带有卡信息的令牌,然后将该令牌以及未令牌化的电话号码传递给我的服务器,但我希望尽可能对所有数据进行分条令牌化。
此示例页面显示了许多收集电话号码的表格,但是源代码似乎主要显示了它们如何设置样式,并且无论哪种方式都没有使用react-stripe-elements,因此该示例不会像我一样镜像想要。
编辑:我发现这个问题的GitHub是提到实现自己的组件提供其他支持的参数,如他们的网页上name,adress_line1等看着被返回的道理,似乎phone根本不是一个支持的领域,所以我只需要以非令牌格式将该信息发送到服务器。如果那只是需要完成的方式,那么我对此表示完全满意。只是想确保我使用正确的方法进行操作。
有几篇关于此的文章(例如,在这里和这里),但是没有人为此使用本地的Mongoose方法。(第一个使用$set,第二个使用extendnpm包。尽管如此,似乎应该有一种“本地猫鼬”方式。
var blogPostSchema = new mongoose.Schema({
title: String,
comments: [{
body: String
}]
});
Run Code Online (Sandbox Code Playgroud)
这是我最初尝试的内容:
BlogPost.findById(req.params.postId, function (err, post) {
var subDoc = post.comments.id(req.params.commentId);
subDoc = req.body;
post.save(function (err) {
if (err) return res.status(500).send(err);
res.send(post);
});
});
Run Code Online (Sandbox Code Playgroud)
问题是这一行:subDoc = req.body实际上并没有更改父文档的subDoc,而只是通过引用传递。save()调用后数据库中实际上没有任何更改。
The extend package fixes this by merging the two objects together, as shown in the second SO post linked above (and again here). But isn't there …
我希望用户对象为了显示目的而保持区分大小写,但为了唯一性目的而将其小写。usernameDisplay我的第一个想法是向架构添加一个属性并尝试预保存挂钩:
var userSchema = new Schema({
username: {
type: String,
required: true,
unique: true,
lowercase: true
},
usernameDisplay: String,
password: {
type: String,
required: true
}
});
userSchema.pre("save", function (next) {
this.usernameDisplay = this.username;
next();
});
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。和username属性usernameDisplay均保存为小写用户名。
我认为以下方法可行:删除lowercase架构中的验证并执行以下操作:
userSchema.pre("save", function (next) {
this.userDisplayName = this.username;
this.username = this.username.toLowerCase();
next();
});
Run Code Online (Sandbox Code Playgroud)
但现在我很好奇 Mongoose 如何对传入数据进行小写验证/更改。
如果我的问题不清楚,请告诉我,我可以尝试更新以使其清楚。
javascript ×4
node.js ×4
express ×3
mongoose ×3
express-jwt ×2
jwt ×2
mongodb ×2
angularjs ×1
django ×1
jasmine ×1
mocha.js ×1
python ×1
reactjs ×1
unit-testing ×1