2019-05-06 07:31:26 -04:00
---
id: 587d7fb6367417b2b2512c07
2020-08-16 04:43:26 +05:30
challengeType: 2
2020-09-17 03:53:54 -07:00
forumTopicId: 301535
2020-10-01 17:54:21 +02:00
title: 创建一个模型
2019-05-06 07:31:26 -04:00
---
## Description
2020-09-17 03:53:54 -07:00
< section id = 'description' >
< b > C< / b > RUD 第一小节—CREATE
首先,我们需要一个 Schema( 架构、模式或纲要, 详情请参阅< a href = 'https://en.wikipedia.org/wiki/Database_schema' > 维基百科</ a > ),每一个 Schema 都对应一个 MongoDB 的 < a href = 'https://docs.mongodb.com/manual/reference/glossary/ #term -collection' > collection</ a > ,并且在相应的 collection 里定义 < a href = 'https://docs.mongodb.com/manual/reference/glossary/ #term -document' > documents</ a > 的“样子”。
Schema 用于组成 Model( 模型) , 我们甚至可以通过嵌套 Schema 来创建复杂的模型。但是这里我们只学习 Schema 的基础用法。
我们可以根据模型创建实例,模型实例化后的对象称为 documents。
Repl.it 是一个真实的服务器。习惯上,我们会编写函数来处理外界与服务器中数据库的交互,这些函数会在特定事件发生(比如有人调用了我们的服务器 API) 时执行。接下来的挑战题目即是以此为基础。< code > done()< / code > 是一个回调函数,它的作用是在一个异步操作(比如对数据库进行插入、搜索、更新或删除)执行完成时,通知我们可以继续执行后续的其它代码。这与 Node.js 中的处理方式十分类似。在 Node.js 中,我们会在(异步操作)成功时调用 < code > done(null, data)< / code > ,在失败时调用 < code > done(err)< / code > 。
注意:与远程服务器进行交互时,我们需要考虑到发生错误的可能
```js
/* 示例 */
var someFunc = function(done) {
//... do something (risky) ...
if(error) return done(error);
done(null, result);
};
```
2019-05-06 07:31:26 -04:00
< / section >
2020-09-17 03:53:54 -07:00
2019-05-06 07:31:26 -04:00
## Instructions
2020-08-16 04:43:26 +05:30
< section id = 'instructions' >
2020-09-17 03:53:54 -07:00
以此为原型创建一个 Person:
< blockquote >
- Person 的原型 -< br >
--------------------< br >
name : string [required]< br >
age : number< br >
favoriteFoods : array of strings (*)
2019-05-06 07:31:26 -04:00
< / section >
## Tests
< section id = 'tests' >
```yml
tests:
2020-09-17 03:53:54 -07:00
- text: 应当成功地通过 Mongoose schema 创建实例
2019-05-06 07:31:26 -04:00
testString: 'getUserInput => $.post(getUserInput(''url'') + ''/_api/mongoose-model'', {name: ''Mike'', age: 28, favoriteFoods: [''pizza'', ''cheese'']}).then(data => { assert.equal(data.name, ''Mike'', ''"model.name" is not what expected''); assert.equal(data.age, ''28'', ''"model.age" is not what expected''); assert.isArray(data.favoriteFoods, ''"model.favoriteFoods" is not an Array''); assert.include(data.favoriteFoods, ''pizza'', ''"model.favoriteFoods" does not include the expected items''); assert.include(data.favoriteFoods, ''cheese'', ''"model.favoriteFoods" does not include the expected items''); }, xhr => { throw new Error(xhr.responseText); })'
```
< / section >
## Challenge Seed
< section id = 'challengeSeed' >
< / section >
## Solution
< section id = 'solution' >
```js
2020-09-17 03:53:54 -07:00
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
2019-05-06 07:31:26 -04:00
```
2020-08-13 17:24:35 +02:00
2020-09-17 03:53:54 -07:00
< / section >