小编rok*_*rok的帖子

W3C地理定位返回缓存的坐标

我有一个Chrome扩展程序,它使用W3C Geolocation API来获取用户的位置.该扩展程序主要用于Chromebook.

我注意到API似乎在大多数情况下返回相同的坐标(缓存?),即使我将maximumAge参数设置为0.我通过在位置#1的Chromebook上部署扩展来测试这一点,然后采用设备到位置#2,距离约1公里.在那里再次调用API并返回与之前相同的坐标.过了一会儿(我间隔10分钟),它返回了正确的坐标,但是当我回到位置#1时,我又从位置#2获得了缓存坐标.

我尝试过getCurrentPosition,watchPosition以及选项对象的几种组合,但似乎总是产生相同的结果.

我目前的代码如下:

function getGeolocation() {
  return new Promise((resolve, reject) => {
    const options = { enableHighAccuracy: true, timeout: 30000, maximumAge: 0 };
    navigator.geolocation.getCurrentPosition(resolve, reject, options);
  });
}

getGeolocation()
  .then(position => handler(position))
  .catch(err => console.error(err));
Run Code Online (Sandbox Code Playgroud)

我需要这个在第一次尝试时或在合理的短时间内返回正确的坐标.有什么建议?

谢谢!

编辑:

要注意的是,浏览器传感器选项卡中的坐标更改每次都能正常工作,但在实际情况下,它似乎在大多数情况下都会返回缓存结果.

编辑(11月5日):

经过一些更多测试后,似乎只在Chrome OS上发生这种情况.我们无法在PC上重现相同的行为(有或没有扩展名).

google-chrome google-chrome-extension w3c-geolocation

6
推荐指数
1
解决办法
363
查看次数

在Mongoose最佳实践的基础上使用Joi进行验证吗?

我正在使用Node.js,Mongoose和Koa开发RESTful API,并且对于模式和输入验证的最佳实践有些困惑。

目前,我对每种资源都有Mongoose和Joi模式。猫鼬模式仅包含有关特定资源的基本信息。例:

const UserSchema = new mongoose.Schema({
  email: {
    type: String,
    lowercase: true,
  },
  firstName: String,
  lastName: String,
  phone: String,
  city: String,
  state: String,
  country: String,
});
Run Code Online (Sandbox Code Playgroud)

Joi模式包含有关对象的每个属性的详细信息:

{
  email: Joi.string().email().required(),
  firstName: Joi.string().min(2).max(50).required(),
  lastName: Joi.string().min(2).max(50).required(),
  phone: Joi.string().min(2).max(50).required(),
  city: Joi.string().min(2).max(50).required(),
  state: Joi.string().min(2).max(50).required(),
  country: Joi.string().min(2).max(50).required(),
}
Run Code Online (Sandbox Code Playgroud)

当写入数据库时​​,Mongoose模式用于在端点处理程序级别创建给定资源的新实例。

router.post('/', validate, routeHandler(async (ctx) => {
  const userObj = new User(ctx.request.body);
  const user = await userObj.save();

  ctx.send(201, {
    success: true,
    user,
  });
}));
Run Code Online (Sandbox Code Playgroud)

Joi模式在验证中间件中用于验证用户输入。对于每种资源,我有3种不同的Joi模式,因为允许的输入取决于请求方法(POST,PUT,PATCH)而有所不同。

async function validate(ctx, next) {
  const user = ctx.request.body;
  const …
Run Code Online (Sandbox Code Playgroud)

rest mongoose node.js koa joi

5
推荐指数
1
解决办法
452
查看次数

在JS promise函数中遍历API响应的多个页面

我有以下promise函数,该函数使用fetch从API获取数据:

const getContacts = token =>
  new Promise((resolve, reject) => {
    fetch(url, {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json',
      },
    })
    .then(response => response.json())
    .then((data) => {
      resolve(data);
    })
    .catch(err => reject(err));
  });
Run Code Online (Sandbox Code Playgroud)

然后在另一个文件中调用此函数:

getContacts(token)
.then((data) => {
  const contacts = data.data;
  console.log(contacts);
})
.catch(err => console.error(err));
Run Code Online (Sandbox Code Playgroud)

当从API返回的数据量较大时,将对其进行分页。响应中包含一个链接,需要获取该链接才能获取下一页。我希望我的代码首先遍历所有页面并收集所有数据,然后解决承诺。当执行到达该const contacts = data.data行时,它应该具有每个页面的数据(当前它仅返回第一页)。

实现这一目标的最佳方法是什么?

编辑:

我尝试在getContacts函数中进行递归。这样,我可以遍历所有页面并在一个对象中获取所有数据,但是我不知道什么是将其解析回代码(最初称为函数)的正确方法。下面的代码无法正确解析。

const getContacts = (token, allData, startFrom) =>
  new Promise((resolve, reject) => {
    if (startFrom) {
      url = `${url}?${startFrom}`; // the api returns a set …
Run Code Online (Sandbox Code Playgroud)

javascript es6-promise

2
推荐指数
1
解决办法
1947
查看次数