mean项目的疑问,应该是架构问题或者代码的理解问题。新手求问。
发布于 6 年前 作者 CokeWithIce 2950 次浏览 来自 问答

首先多谢能进来看看。主要是自己写代码时候遇到的问题。 最近开了一本源于mean框架下搭建服务的书。自己写了一个关于这个框架。书上介绍的很简单。基本上就是路由直接连接mongo就结束了。一点关于controller,service,dao层的描述都没有。自己凭着当初学java时候的印象补上了这些东西,然后果然出问题了。括弧笑。 首先来看看结构 图片.png package.json文件 图片.png 如图所示啊。 bin什么都没有。router,controller,service,dao不用多说了,views是html文件的家,(我没使用模板引擎,打算前端页面控制直接使用angular),public是客户端的js,css,image文件的地方。 结构知道了。 基本的后台流程我思考的是: (一系列前台的操作,暂无问题,暂不赘述)》》》app.js》》》router》》》controller》》》service》》》dao》》》response.json返还json值。交给前端的angular去渲染页面。 那现在就是有问题了。 只要是中间件的问题。我在别人的博客上看见了关于monk的使用法。导入了monk(package.json可见); 导入使用都没有问题但是使用时候我发现了一个问题 图片.png 如上图所示代码。我在dao层写的都是构造函数。当service层要使用这个dao层代码时候是先做个实例。然后用实例的方法来共同数据库来取得数据。 service层部分代码如下图 图片.png 我本来是想的直接使用return 回去dao层查到的数据。但是发现返回的数据是undefined;原因是 图片.png 上图所示的红框部分的代码是异步的。神tm异步的。reObj没有等到赋值。直接返回了。神tm直接返回了。然后我就想到中间件的使用法。或者是阻塞的使用法。最后的结果是我神TM不会。。。。。。咋办呢? 我想到的办法是使用参数。 从控制层开始把流程参数写进去。。。如下代码所示。 router代码 图片.png controller代码 图片.png service代码 图片.png dao代码 图片.png 这样就可以执行了。可是,可是,可是; 这个只适用一个表的查询。要是查两个表怎么破? 艹艹艹。 最后还是想不到办法。 早听说咱这神人辈出,高手如云。希望能有朋友帮我这个忙。帮我指点下。是不是当初我想的思路就是错误的。还是我学的时候漏了什么部分。 多谢指点。

6 回复

太乱了没有仔细看,应该是异步流程控制的问题。 image.png

collection.find 操作是异步的,操作完成之后会执行后面那个回调函数,所以你应该把 res.json(reObj) 之类的操作写在回调函数里

collection.find(condition, function(err, users) {
  if (err) console.log(err);
  res.json(users);
});

而不是写在外面,这样还没执行到这个赋值操作就返回了。

如果你真的想做同步的控制,建议去了解下 generator 和 co,或者去看看 async / await 函数。搜一下 ruanyifeng 博客或者参考下 mdn 上的教程。

@rrbe 说的很对。reObj是个object里面有回调函数方法。但是这样就编程以后我只能查一个表了。如果我有users表和另外的一个product表。要同时查找这两个表。然后组合数据返还给前端。这个该怎么办呢?

@CokeWithIce 查询 users 表的 callback 函数里面,再去查询 product 表呗,最后在查 product 表的 callback 里面 res.json() 这样有一个缺点就是可能嵌套很多层 callback,逻辑看起来不清晰,也就是传说中的回调地狱了。所以才推荐你去看同步控制的方法。

mongo 里面没有外键的概念,可以参考根据 id 关联查询另一张表的用法。DBRefs

@rrbe ok大概明白了。。。难道就是因为这个原因所以才不合适做大项目么。。。。

@CokeWithIce callback 式的写法逻辑嵌套多了确实容易乱,但是在后端来说,generator 和 async 函数应该也很多人用了,所以也还好吧。

可以去了解一些别的框架,比如和 express 同一个作者写的 koa 以及 koa2。以及狼叔的帖子比如 狼叔回复的《Node相比传统服务端技术栈好在哪里?》

而且 Node 似乎在阿里的应用很广泛啊,还有开源的企业级应用框架 egg.js. 所以应该谈不上不适合做大项目啦。

@CokeWithIce 你应该没有转变到node的基于事件的异步编程的思维中来,这里你的代码很奇怪,我怀疑你都没有从简单的项目开始。

node不适合大型项目并不是这个原因,callback地狱有async/await可以避免。

主要node没有优秀到碾压的程度,你知道吗,风险,更换技术栈的风险。 第二作为弱类型的固定缺陷和优点,虽然这方面有typescript。 所以他远远达不到java的社区氛围。

node可以做大型项目,可以试试egg.js,阿里出品的。

回到顶部