Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all 14821 articles
Browse latest View live

请教一个promise执行顺序的问题,有关resolve一个promise以及注册callback的顺序

$
0
0
const original = Promise.resolve(2)
new Promise((resolve) => {
	resolve(original);
	Promise.resolve().then(() => Promise.resolve().then(() => console.log(1)))
	console.log(4)
}).then(t => console.log(t))
console.log(3)

这样一段代码. 按照我的理解 因为original已经被resolve,所以它的状态被new Promise继承 然后执行Promise.resolve并注册回调 然后打印4 然后注册new Promise的回调 然后打印3 然后执行第一个注册的回调,并注册第三个回调 然后打印t,也就是2 然后执行第三个回调,也就是1

可是执行结果却是4,3,1,2 想不通为什么,特来求教! 谢谢各位大牛~~~


和Node有那么一点点关系...总之是吓到我了

$
0
0

最近一个星期在瞎搞自己写一个服务器 刚才无聊拿node跑了个测试 好吧… 不是挑事 但是真的吓到我了 benchmark.png因为我还是个看了几天C语言的新手 只能解释为是Chez Scheme比较快吧 项目地址: https://github.com/guenchi/Igropyr

WechatIMG24.jpeg

WechatIMG25.jpeg

vue弹窗的表格验证

$
0
0

项目中弹窗的表格需要验证用户填入的信息,我看见elment上有表单验证,但是好像不能套用在表格上,请问各位大神有没有什么好方法能验证表格的?求告知,谢谢

一个程序员基佬微信群

$
0
0

不知道有没有违反规定,求管理员手下留情。

如题

Boolean(programmer && gay) == true

谢绝其他行业从事者,不好意思了。只加码农,谢谢。

群里目前200人,想加的话留下微信或者邮箱,会及时拉你进群。

长期有效 周末快乐。

mongoose 如何保存一对多关联

$
0
0

目前我是这么存的,team collection

{ 
    "_id" : ObjectId("5a9a9b33c68fa11f9cc60288"), 
    "name" : "WE", 
    "players" : [
        ObjectId("5a9a9b33c68fa11f9cc60289"), 
        ObjectId("5a9a9b33c68fa11f9cc6028a"), 
        ObjectId("5a9a9b33c68fa11f9cc6028b"), 
        ObjectId("5a9a9b33c68fa11f9cc6028c"), 
        ObjectId("5a9a9b33c68fa11f9cc6028d")
    ], 
    "__v" : NumberInt(0)
}

model是

module.exports = mongoose.model('Teams', new Schema({
  name: String,
  players: [{
    type: Schema.Types.ObjectId,
    ref: 'Players'
  }]
}));

一个战队下面有很多队员,我创建team的时候怎么插入player呢 如下代码不行:

function loadTeamPlayerData() {
  const data = require('../mockdata/players');
  data.forEach(item => {

    let playerIds = [];
    
    item.players.forEach((player, index) => {
      let playerModel = new Player({name: player.name})
      playerModel.save(() => {
        playerIds.push(new ObjectId(playerModel._id))
        // teamModel.players.push(playerModel._id)
      })
    })
    
    let teamModel = new Team({name: item.team, players: playerIds})

    teamModel.save().then(() => {
      console.log('load team: %s', item.team)
      console.log(playerIds)
    })
  })
}

假数据 data/player.js

  {
    team: 'WE',
    players: [
      {
        name: 'xiye'
      },
      {
        name: 'Mystic'
      },
      {
        name: 'Condi'
      },
      {
        name: 'Zero'
      },
      {
        name: '957'
      }
    ]
  }]

sequelize 链接资源使用完毕会自动释放吗?

$
0
0

如题, sequelize 链接资源使用完毕会自动释放吗? 目前只看到一个 close方法, 但是源码中的

注释信息如下:

Close all connections used by this sequelize instance, and free all references so the instance can be garbage collected.

并没有看到类似 release的方法

algolia-cnode即时搜索实现- React版

$
0
0

algolia-cnode即时搜索实现- React版

参考的文献是: Algolia Auto-Sync for GraphQL backends. 实现了 Graphql 数据数据添加和删除时的数据同步

基本流程是,你给 algolia 提供一个需要索引的文本或者资源, algolia 会做出索引, 之后就可以使用提供的 API获取结果.

总共索引了1-95页的数据, 可能排序上还要优化, 方法现在没有问题

基础流程没有什么问题.遇到的问题是,之前从 medium 网站抓取了300多篇文章, 建完索引之后,没有结果. algolia 实现的是在建立索引机制以后的数据才可以使用, 我索性把 cnode 1-95页的数据都建了索引. cnode 每页是40条, 总共是3800条数据, 现在有3600数据加了索引,没有插入的还没看是什么原因.

大概步骤

项目分为四大块::后台服务器,组要是由于目前在使用 graphql,觉得很有潜力,而且 graphcool 提供了 algolia 的整合服务,使用还是比较简单的,主要工作是建立模型,导入和 aloglia 对接的 APP ID和 Token. : algolia 上的配置, 主要 是获取 APPID和 Token. : 从 cnode,导入数据,严格说这一部分和这里的文章关系不太大. : 前端的配置, 这个有教程,最简单的异步, 获取数据的方法都封装好了, 直接使用即可.

实现的结果

实现方案

注册,建立应用,获取 APPID

  • 登录:https://www.algolia.com,注册直接用 github 登录.

  • :点击右上角 dashboard 进入管理界面

  • : 点击创建一个应用

  • :进入应用,其他不动, 我们只会使用到 key, 点击钥匙

  • : 这里会有一个 search-only-key,专门用于前端搜索用的, 我们在 all api key下创建一个新的有用读写记录的key. 注意还有 application ID

  • 点击

  • : 设置,名字,还有权限,只需要读写的权限就可以了.点击生成, 看到的结果是有读写的内容而搜索的 key是这样 only search

    通过以上的步骤,现在我们有三个要使用的 id, 一个应用的 ID,一个所有使用的key,一个用于配置服务的key. 由于用于索引的数据都是从后台同步的,这里目前就不要再做任何的工作了. 后续可以做些优化工作.

后台服务服务的建立

建立模型

  • 创建 graphcool服务器, 这个参看 graphcool网站的教程,

  • 建立模型

创建了一个简单的模型包含有 title,content, tab 字段,添加其他的也可以.首要任务是跑通流程

  • 使用整合服务

    整合 aloglia 的服务, 点击进入

  • 添加key

有两个key,我们要使用允许读写的的那个key才行

  • 点击添加 index
//这里实际是一个 Graphql的查询,所以灵活性很大. 
   {
    node {
      content
      tab
      title
    }
  }

点击创建 index,我们的配置工作就完成了 现在可以添加一条索引,验证一项 algolia 会不会自动同步数据

dashboard 中如果有记录,证明数据同步成功了.如果这里是0,要看看前面的配置有没有问题,如果有问题,不要急着做下一步, 到这里配置就完成了, 导入数据和配置是独立的过程.

在 graphcool 手动输入一条信息, algolia如果有记录出现,配置完成 接着进行下一步, 导入数据

导入数据, 这里不详细说, 通过 cnode的 API获取数据,然后依照 graphql 的mutate 方法,导入到 Graphcool 的数据库.参见下面的代码

'use strict'
import express from 'express'
import bodyParser from 'body-parser'
import cors from 'cors'
import * as R from 'ramda'
var path = require('path')
require('es6-promise').polyfill()
require('isomorphic-fetch')
import fetch from 'node-fetch'
import { request } from 'graphql-request'
const dataArray = []
var t = require('transducers-js') // 导入transducers-js执行tranducer操作
const URL = 'http://localhost'
const PORT = 3001
const api = 'https://api.graph.cool/simple/v1/cjearwrd40zes01671xikrsnh' // graphcool API
// graphql模板-数据插入的模板
const mu = `mutation createList(
  $tab: String!,
  $content:String!,
  $title: String!
){
 createList(
    content: $content,
    tab:$tab,
    title:$title,
   ){
        id
    }

}`
//主方法
export const start = async () => {
  try {
  const app = express()

		app.use(cors())
		app.use(express.static(__dirname))
		app.listen(PORT, () => {
  console.log(`Visit ${URL}:${PORT}`)
		})
		const startTime = Date.now()
		

		for (var i = 1; i <= 95; i++) {
    const pageData = await singlePageData(i) //获取单页数据
			  dataArray.push(pageData) 
		}

    const flattenData = R.flatten(dataArray)
    const getData = compose(R.map(insertData), flattenData)
		await getData(dataArray); //插入数据库
		const endTime = Date.now()
		const spend = endTime - startTime
		console.log('spending time:', spend)
	} catch (e) {
  console.log(e)
	}
}
//单条记录插入 graphcool数据库的方法
const insertData = data => {
  var flattenData = function (n) {
  return {
  content: n.content,
  tab: n.tab,
  title: n.title
}
	};
//数据插入 graphql 数据方法柯理化
  const func = R.curry((api, template, variables) =>
		request(api, template, variables).then(data => {
  console.log('data:', data)
		})
	)

	const waitForData = func(api, mu)
	var xf = t.comp(R.map(flattenData), R.map(waitForData))
 //这里用了 transducer.js 的方法
	const mediateFunc = R.curry((xf, data) => t.into([], xf, data))
	const getFinalRes = mediateFunc(xf)
	getFinalRes(data)
};

//异步 compose 方法
const compose = (...functions) => input =>
	functions.reduceRight((chain, func) => chain.then(func), Promise.resolve(input))
//拼接 API的方法
const variablesTemp = num => `https://cnodejs.org/api/v1/topics?page=${num}`
//获取数据,并取出 data字段的方法
const fetchData = url => fetch(url).then(res => res.json()).then(data => data.data)
//异步 compose 组合的获取 API url 并 获取数据的方法
const singlePageData = compose(fetchData, variablesTemp)

插入数据以后, 在 graphcool 后台可以看到记录数, 在 algolia的 dashboard 也可以看到记录数. 整个配置和数据导入就完成了.

由于我们这里是从 cnode获取手动获取数据, 如果是原生使用 Graphcool 的数据库, 插入条目以后,会立刻自动通过. 用 cnode 的 API稍微麻烦一点

前端的配置

React/React-Native的配置 可以在github搜索,有很多代码实例

app.js 文件配置 导入 app ID 和仅用于搜索的 key和 index name.这个 name 是在后台配置时建立的, algolia 显示的就是这个名字.

import React from "react";
import { Text, View } from "react-native";
import { InstantSearch } from "react-instantsearch/native";
import styles from "./src/styles";
import SearchBox from "./src/SearchBox";
import Results from "./src/Results";

export default class App extends React.PureComponent {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.brandTitle}>Medium Search</Text>
        <InstantSearch
          appId="BA28CTOPE6"  
          apiKey="19348cf2875c2023552115b820856f9d"
          indexName="cnodeList"
        >
          <View style={styles.searchBoxContainer}>
            <SearchBox />
          </View>
          <Results />
        </InstantSearch>
      </View>
    );
  }
}

Searchbox.js 输入的数据和 algolia 发生联系的组件

import React from "react";
import { TextInput } from "react-native";
import { connectSearchBox } from "react-instantsearch/connectors";
import styles from "./styles";

const SearchBox = connectSearchBox(({ refine, currentRefinement }) => {
  return (
    <TextInput
      style={styles.textBox}
      onChangeText={text => refine(text)}
      value={currentRefinement}
      placeholder="Search Something"
      clearButtonMode="always"
      spellCheck={false}
      autoCorrect={false}
      autoCapitalize="none"
    />
  );
});

export default SearchBox;

List 列表显示数据

import React from "react";
import { FlatList } from "react-native";
import { connectInfiniteHits } from "react-instantsearch/connectors";
import Repository from "./Repository";
import ItemSeperator from "./ItemSeperator";

const Results = connectInfiniteHits(({ hits, hasMore, refine }) => {
  const onEndReached = () => {
    if (hasMore) {
      refine();
    }
  };
  //终端打印搜索数据
  console.log(hits);

  return (
    <FlatList
      data={hits}
      onEndReached={onEndReached}
      keyExtractor={repo => repo.objectID}
      renderItem={({ item }) => <Repository repo={item} />}
      ItemSeparatorComponent={ItemSeperator}
    />
  );
});

export default Results;

具体的 item,就不写了. 其实上面 console.log 打印出数据整个流程就完成了.在 algolia 的 dashboard 也可以查看搜索的情况

整个即时搜索的流程完成, 速度还是挺快的, 大部分工作人家的算法帮我们完成了.

如果查看页面发现还有许多要优化的地方,后面再说.

关于egg.js使用sequelize.js时 碰到联合查询时的问题

$
0
0

联合查询时 var User = sequelize.define(‘user’, {/* … /}) var Project = sequelize.define(‘project’, {/… */})

// hasOne 关系 Project.hasOne(User)
这个表示了1:1的关系 我在使用egg.js时,我该去哪里设置这个关系?


请问,如何使用Nodejs实现一个P2P分享软件?

$
0
0

我们用Electron做了一个软件,希望加入一个文件分享功能,但是不希望这些文件存在服务器中,因为有一定的法律风险。所以想到了P2P的分享模式,请问,该如何实现该需求啊?就像之前我们用的电驴啦,utorrent那样,可以搜索别人分享的硬盘内容,然后下载的。

多谢

pm2使用问题请教

$
0
0

pm2 监控某个任务,比如设置max_memory_restart为1024M的话,当这个任务正在执行的时候,占用的内存超过了1024M,这个时候会不会重启,会不会导致正在执行的任务停止呢???

请问大佬们,都说nodejs是单线程的?

$
0
0

如果A用户和B用户同时请求了服务器,服务器处理每个请求需要10s才能返回给用户, ①:如果nodejs是单线程的,使用异步,将10s的查询结果插入到event loop里,怎么原路返回给用户?res.end()也是使用libuv利用事件函数操作了系统线程返回到对应的用户的机器的吗? ②:js没有io操作能力,利用了libuv进行io操作?,都是js单线程,性能高因为不用应对每个用户请求创建新线程,线程创建和销毁造成资源浪费?但是nodejs底层的libuv是多线程的线程池用来并行io操作?如果是的话,那么libuv多线程创建,销毁不会对资源造成浪费吗?如果页造成浪费,那么在js胶水语言层的单线程又能减少多少系统资源呢?

以上都是小弟迷惑的地方,请了解详情的大佬指点一二。感谢ing

【深圳】云之梦 - 招聘前端工程师

$
0
0

云之梦科技

工作地点

深圳软件产业基地

工作内容

  • 负责移动端手淘、微信内H5页面维护和开发
  • 负责PC端现有产品线和管理后台维护和开发
  • 负责前沿技术研究与探索,并应用到团队与产品中

任职要求

  • 计算机相关专业3年以上工作经验
  • 具备良好的团队精神、沟通能力、自我驱动力、学习能力
  • 熟练使用HTML5、CSS3、原生JavaScript、ES6
  • 掌握Angular/React/Vue中至少1个框架,且有实际项目开发经验
  • 熟练使用Node,掌握Express、Koa或其他第三方框架,且有实际项目开发经验
  • 丰富的微信公众号和单页面应用(SPA)开发经验
  • 对前端工程化与模块化有实际的了解和实践经验

加分项

  • Hybrid App
  • JavaScript 3D

邮箱:lik@cloudream.com

关于vue-router的跳转问题。

$
0
0

用的是params和query的方法传参。 类似 user/:id => user/kevin 我在调试关于直接跳转的部分,既然用的是query 是由url方式传参的,为什么我在浏览器直接输入 user/mark 不能跳转呢? 求大佬解答

执行接口里的fs.rename,报错:operation not permitted,rename。。。

分享个人开发的在线写书博客(附上源码)

$
0
0

个人开发的在线写书博客

源码地址:beibq

因为很多博客系统都是以文章的形式为主;如果记录的文章变多了,还需要进行分类,而且查找以前写过的某篇文章会比较麻烦。

beibq是用写书的方式来写博客,因为书籍本身就具有分类功能,就算记录的内容变多了也不觉得乱,而且在阅读时通过点击书籍目录很方便的切换到其他章节。

关于编辑器

beibq的编辑器支持Markdown,Markdown是一个标记语言,只需要几个简单的标记符号就能转化成丰富的HTML格式,特别适合写博客。关于Markdown的具体介绍:Markdown 语法说明

beibq的编辑器界面简洁、操作简单,能够通过工具栏或快捷键方式输入Markdown标记符号,有效的提高写作效率;编辑器的目录区支持章节拖拉,可以调整章节顺序。

编辑器例子:在线写书

beibq的编辑器是纯js实现,我单独将它开源出来:bookeditor

界面

beibq的界面简洁、美观、易用。阅读博客时,就像看书一样,界面包含书籍目录;这样只要点击目录的某个章节就能很方便切换到其他章节。

为了提高切换章节效率,当点击目录中某个章节,通过ajax异步请求章节内容,这样可以不仅提高页面刷新速度而且具有很好的阅读体验;

其实使用ajax异步请求章节会出现一个问题,当网络延迟高,用户短时间内点击多个章节,会导致页面显示混乱;为了解决这个问题,我设计一个队列,将用户点击章节时将该事件缓存到队列中,如果短时间内接收多个点击事件,我其实只请求队列中最后的一个事件。

beibq还可以自动适配移动端界面,用户可以在移动设备上阅读。

安装使用

1. 安装mysql

beibq使用的数据库是mysql,安装前需要先安装mysql

我使用的是centos,安装方法可以参考该文档:Installing MySQL on Linux Using the MySQL Yum Repository

2. 安装依赖包

pip install -r requirements.txt

3. 启动程序

python manage.py runserver -h 0.0.0.0

4. 配置站点

在浏览器中输入http://127.0.0.1:5000

第一次访问会跳转到配置界面,根据指示配置站点信息后就能使用beibq


koa2文件上传怎么做呢?

$
0
0

需要接受到前端上传的文件或者图片 koa2中要怎么做呢?

testtest

$
0
0

test01test01test01test01test01test01test01test01test01test01test01test01test01test01test01

nodejs如何去监听数据库里面有新的数据插入?

$
0
0

如题,nodejs如何去监听mysql数据库的指定的某一张表里面有新的数据插入?

分享一个使用vue+egg开发一简单的博客 | 论坛。

【杭州】杭州有赞招聘前端工程师、Nodejs工程师

$
0
0
关于有赞

有赞是一家sass软件公司,服务于移动电商和新零售,目前主要的产品有微商城、零售、美业等。目前为止已经有几百万的商家在有赞开店,他们来自于自媒体、品牌商及中小商家。 关于有赞文化,可以点这里查看

岗位职责
  1. 参与微信端、APP端的移动Web、微信小程序、PC WebApp 等前端开发;
  2. 参与公司内部系统建设(包括Node全栈开发);
  3. 参与改进开发、构建、发布等前端工程化体系;
  4. 参与Web性能优化、体验优化;
  5. 参与推动UI规范制定和落地;
  6. 参与新技术探索、推进系统架构的演化;
岗位要求
  1. 本科及以上学历;
  2. 扎实的计算机以及网络基础;
  3. 阅读英文技术文档和书籍无障碍;
  4. HTML、CSS、JavaScript 基础扎实,了解 HTTP 协议以及浏览器原理;
  5. 参与开源项目并贡献过代码 加分;
  6. 有 Hybrid APP、大型 Node 项目实施经验 加分;
  7. 请在简历里写明 Github 账号或博客地址;

简历邮件:jinfeng@youzan.com

Viewing all 14821 articles
Browse latest View live